# Peek - スクリプト関数

Peek() は、すでにロードされている行に対してテーブルの項目値を返します。行番号は、テーブルと同様に指定できます。行番号が指定されていない場合は、最後にロードされたレコードが使用されます。

`Peek()` 関数は、以前にロードされたテーブル内の関連する境界、つまり特定の項目の最初の値または最後の値を見つけるために最もよく使用されます。ほとんどの場合、この値は後で使用するために、例えば do-while ループの条件として変数に格納されます。

構文:

Peek(

field\_name

[, row\_no[, table\_name ] ])

戻り値データ型： デュアル

引数：

引数

| 引数 | 説明 |
| --- | --- |
| field\_name | 戻り値が必要な項目名。入力値は文字列として指定する必要があります (たとえば、引用符で囲まれた文字列)。 |
| row\_no | テーブルの行。必要な項目がある行を指定します。数式の場合を指定することもできますが、結果が整数になる必要があります。0 は最初のレコード、1 は 2 番目のレコードを示し、以下同様に表されます。負の数は、テーブルの最後から見た順序を表します。 -1 は、読み取られた最後のレコードを示します。<br><br>row\_no が指定されていない場合は、-1 として処理されます。 |
| table\_name | 末尾にコロンが付いていない、テーブルのラベルです。table\_name が指定されていない場合は、現在のテーブルとして処理されます。LOAD ステートメント以外で使用する、または他のテーブルを参照する場合は、table\_name が含まれている必要があります。 |

制限事項:

この関数は、既にロードされているレコードからのみ値を返すことができます。これは、テーブルの最初のレコードで、`row_no` として -1 を使用する呼び出しが NULL を返すことを意味します。

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/InterRecordFunctions/Peek.htm)

#### 例と結果:

## 例 1

アプリにスクリプト例を追加して実行します。結果を表示するには、結果列に含まれている項目をアプリのシートに追加します。

```
EmployeeDates:
Load * Inline [
EmployeeCode|StartDate|EndDate
101|02/11/2010|23/06/2012
102|01/11/2011|30/11/2013
103|02/01/2012|
104|02/01/2012|31/03/2012
105|01/04/2012|31/01/2013
106|02/11/2013|
] (delimiter is '|');
     
First_last_Employee:
Load 
EmployeeCode, 
Peek('EmployeeCode',0,'EmployeeDates') As FirstCode, 
Peek('EmployeeCode',-1,'EmployeeDates') As LastCode
Resident EmployeeDates;
```

結果のテーブル

| Employee code | StartDate | EndDate | FirstCode | LastCode |
| --- | --- | --- | --- | --- |
| 101 | 02/11/2010 | 23/06/2012 | 101 | 106 |
| 102 | 01/11/2011 | 30/11/2013 | 101 | 106 |
| 103 | 02/01/2012 |  | 101 | 106 |
| 104 | 02/01/2012 | 31/03/2012 | 101 | 106 |
| 105 | 01/04/2012 | 31/01/2013 | 101 | 106 |
| 106 | 02/11/2013 |  | 101 | 106 |

`  Peek('EmployeeCode',0, 'EmployeeDates') ` が、EmployeeDates テーブルの EmployeeCode の最初の値を返すため、FirstCode = 101 になります。

`  Peek('EmployeeCode',-1, 'EmployeeDates') ` はテーブル EmployeeDates の EmployeeCode の最後の値を返すため LastCode = 106 です。

引数 row\_no の値を置き換えた場合、以下のように、テーブルの他の行の値を返します。

`  Peek('EmployeeCode',2, 'EmployeeDates') ` はテーブル内の 3 番目の値 103 を FirstCode として返します。

ただし、これらの例で 3 番目の引数 table\_name にテーブルを指定しない場合は、関数は現在のテーブル (この場合は、内部テーブル) を参照します。

## 例 2

テーブルのさらに下のデータにアクセスする場合は、2 つのステップでアクセスする必要があります。最初にテーブル全体を一時的なテーブルにロードし、次に Peek() を使用するときに再ソートします。

アプリにスクリプト例を追加して実行します。結果を表示するには、結果列に含まれている項目をアプリのシートに追加します。

```
T1:
LOAD * inline [
ID|Value
1|3
1|4
1|6
3|7
3|8
2|1
2|11
5|2
5|78
5|13
] (delimiter is '|');

T2:

LOAD *,
IF(ID=Peek('ID'), Peek('List')&','&Value,Value) AS List
RESIDENT T1
ORDER BY ID ASC;
DROP TABLE T1;
```

Create a table in a sheet in your app with ID, List, and Value as the dimensions.

結果のテーブル

| ID | [List] (リスト) | 値 |
| --- | --- | --- |
| 1 | 3,4 | 4 |
| 1 | 3,4,6 | 6 |
| 1 | 3 | 3 |
| 2 | 1,11 | 11 |
| 2 | 1 | 1 |
| 3 | 7,8 | 8 |
| 3 | 7 | 7 |
| 5 | 2,78 | 78 |
| 5 | 2,78,13 | 13 |
| 5 | 2 | 2 |

この IF() ステートメントは、一時的なテーブル T1 を利用して構築されています。   
`Peek('ID')` は、現在のテーブル T2 の現在の行の 1 行前の ID 項目を参照します。  
`Peek('List')` は、T2 の現在の行の 1 行前の List 項目を参照しており、評価対象の数式として構築されています。

ステートメントは次のように評価されます。  
ID の現在の値が ID の 1 行前の値と同じ場合、Peek('List') の値を Value の現在の値と連結して書き込みます。それ以外の場合は、Value の現在の値のみ書き込みます。

Peek('List') に連結された結果がすでに含まれている場合、Peek('List') の新しい結果がその結果に連結されます。

情報メモOrder by 節に注意してください。表のソート方法 (ID による昇順) を指定しています。この指定がない場合、Peek() は、内部テーブルのデータ順序を使用するので、予測不可能な結果につながります。

## 例 3

アプリにスクリプト例を追加して実行します。結果を表示するには、結果列に含まれている項目をアプリのシートに追加します。

```
Amounts:
Load 
Date#(Month,'YYYY-MM') as Month,
Amount,
Peek(Amount) as AmountMonthBefore 
Inline
[Month,Amount
2022-01,2
2022-02,3
2022-03,7
2022-04,9
2022-05,4
2022-06,1];
        
```

結果のテーブル

| Amount | AmountMonthBefore | Month |
| --- | --- | --- |
| 1 | 4 | 2022-06 |
| 2 | - | 2022-01 |
| 3 | 2 | 2022-02 |
| 4 | 9 | 2022-05 |
| 7 | 3 | 2022-03 |
| 9 | 7 | 2022-04 |

項目 AmountMonthBefore は前月の金額を保持します。

ここでは、row\_no パラメータと table\_name パラメータが省略されているため、既定値が使用されます。この例では、次の 3 つの関数呼び出しは同等です。

* Peek(Amount)
* Peek(Amount,-1)
* Peek(Amount,-1,'Amounts')

row\_no として -1 を使用することは、前の行の値が使用されることを意味します。この値を代入することにより、テーブル内の他の行の値を取得できます。

Peek(Amount,2) は、テーブルの 3 番目の値 7 を返します。

## 例 4:

正しい結果を得るには、データを正しくソートする必要がありますが、残念ながら、これが常に当てはまるとは限りません。さらに、Peek() 関数を使用して、まだロードされていないデータを参照することはできません。一時的なテーブルを使用し、データを複数回パスすることで、このような問題を回避できます。

アプリにスクリプト例を追加して実行します。結果を表示するには、結果列に含まれている項目をアプリのシートに追加します。

```
tmp1Amounts:
Load * Inline
[Month,Product,Amount
2022-01,B,3
2022-01,A,8
2022-02,B,4
2022-02,A,6
2022-03,B,1
2022-03,A,6
2022-04,A,5
2022-04,B,5
2022-05,B,6
2022-05,A,7
2022-06,A,4
2022-06,B,8];

tmp2Amounts:
Load *,
If(Product=Peek(Product),Peek(Amount)) as AmountMonthBefore
Resident tmp1Amounts
Order By Product, Month Asc; 
Drop Table tmp1Amounts;

Amounts:
Load *,
If(Product=Peek(Product),Peek(Amount)) as AmountMonthAfter
Resident tmp2Amounts
Order By Product, Month Desc; 
Drop Table tmp2Amounts;
```

説明

初期テーブルは月ごとに並べ替えられます。つまり、peek() 関数は、多くの場合、間違った製品の金額を返します。したがって、このテーブルは再ソートする必要があります。これは、新しいテーブル tmp2Amounts を作成するデータの 2 番目のパスを実行することによって行われます。Order By 節に注意してください。最初に製品ごとに、次に月ごとに昇順でレコードをソートします。

AmountMonthBefore は、前の行に同じ製品の前月のデータが含まれている場合にのみ計算する必要があるため、If() 関数が必要です。現在の行の製品を前の行の製品と比較することにより、この条件を検証できます。

2 番目のテーブルが作成されると、Drop Table ステートメントを使用して最初のテーブル tmp1Amounts がドロップされます。

最後に、データを介して 3 番目のパスが作成されますが、月は逆の順序でソートされます。このようにして、AmountMonthAfter も計算できます。

情報メモOrder by 句は、テーブルの順序を指定します。 これらがないと、Peek() 関数は内部テーブルの任意の順序を使用するため、予期しない結果が生じる可能性があります。

結果

結果のテーブル

| Month | Product | Amount | AmountMonthBefore | AmountMonthAfter |
| --- | --- | --- | --- | --- |
| 2022-01 | A | 8 | - | 6 |
| 2022-02 | B | 3 | - | 4 |
| 2022-03 | A | 6 | 8 | 6 |
| 2022-04 | B | 4 | 3 | 1 |
| 2022-05 | A | 6 | 6 | 5 |
| 2022-06 | B | 1 | 4 | 5 |
| 2022-01 | A | 5 | 6 | 7 |
| 2022-02 | B | 5 | 1 | 6 |
| 2022-03 | A | 7 | 5 | 4 |
| 2022-04 | B | 6 | 5 | 8 |
| 2022-05 | A | 4 | 7 | - |
| 2022-06 | B | 8 | 6 | - |

## 例 5

アプリにスクリプト例を追加して実行します。結果を表示するには、結果列に含まれている項目をアプリのシートに追加します。

```
T1:
Load * inline [
Quarter, Value
2003q1, 10000
2003q1, 25000
2003q1, 30000
2003q2, 1250
2003q2, 55000
2003q2, 76200
2003q3, 9240
2003q3, 33150
2003q3, 89450
2003q4, 1000
2003q4, 3000
2003q4, 5000
2004q1, 1000
2004q1, 1250
2004q1, 3000
2004q2, 5000
2004q2, 9240
2004q2, 10000
2004q3, 25000
2004q3, 30000
2004q3, 33150
2004q4, 55000
2004q4, 76200
2004q4, 89450 ];

T2:
Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal;
Load Quarter, sum(Value) as SumVal resident T1 group by Quarter;
```

結果

結果のテーブル

| Quarter | SumVal | AccSumVal |
| --- | --- | --- |
| 2003q1 | 65000 | 65000 |
| 2003q2 | 132450 | 197450 |
| 2003q3 | 131840 | 329290 |
| 2003q4 | 9000 | 338290 |
| 2004q1 | 5250 | 343540 |
| 2004q2 | 24240 | 367780 |
| 2004q3 | 88150 | 455930 |
| 2004q4 | 220650 | 676580 |

説明

Load ステートメント Load \*, rangesum(SumVal,peek('AccSumVal')) as AccSumVal には、前の値が現在の値に追加される再帰呼び出しが含まれています。この演算子はスクリプト内の値の累積を計算するために使用されます。

## 詳細を見る

* [テーブル ラベル](https://help.qlik.com/ja-JP/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/table-labels.htm)
* [Previous - スクリプト関数](https://help.qlik.com/ja-JP/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/InterRecordFunctions/Previous.htm)