Peek - スクリプト関数
Peek() は、すでにロードされている行に対してテーブルの項目値を返します。行番号は、テーブルと同様に指定できます。行番号が指定されていない場合は、最後にロードされたレコードが使用されます。
peek() 関数は、以前にロードされたテーブル内の関連する境界、つまり特定の項目の最初の値または最後の値を見つけるために最もよく使用されます。ほとんどの場合、この値は後で使用するために、例えば do-while ループの条件として変数に格納されます。
構文:
Peek(
field_name
[, row_no[, table_name ] ])
戻り値データ型: dual
引数:
引数 | 説明 |
---|---|
field_name | 戻り値が必要な項目名。入力値は文字列として指定する必要があります (たとえば、引用符で囲まれた文字列)。 |
row_no |
テーブルの行。必要な項目がある行を指定します。数式の場合を指定することもできますが、結果が整数になる必要があります。0 は最初のレコード、1 は 2 番目のレコードを示し、以下同様に表されます。負の数は、テーブルの最後から見た順序を表します。 -1 は、読み取られた最後のレコードを示します。 row_no が指定されていない場合は、-1 として処理されます。 |
table_name | 末尾にコロンが付いていない、テーブルのラベルです。table_name が指定されていない場合は、現在のテーブルとして処理されます。LOAD ステートメント以外で使用する、または他のテーブルを参照する場合は、table_name が含まれている必要があります。 |
制限事項:
この関数は、既にロードされているレコードからのみ値を返すことができます。これは、テーブルの最初のレコードで、row_no として -1 を使用する呼び出しが NULL を返すことを意味します。
例 1
アプリにスクリプト例を追加して実行します。結果を表示するには、結果列に含まれている項目をアプリのシートに追加します。
従業員コード | 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() を使用するときに再ソートします。
アプリにスクリプト例を追加して実行します。結果を表示するには、結果列に含まれている項目をアプリのシートに追加します。
Create a table in a sheet in your app with ID, List, and Value as the dimensions.
ID | リスト | 値 |
---|---|---|
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') の新しい結果がその結果に連結されます。
例 3
アプリにスクリプト例を追加して実行します。結果を表示するには、結果列に含まれている項目をアプリのシートに追加します。
Amount | AmountMonthBefore | 月 |
---|---|---|
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 も計算できます。
結果
月 | 製品 | Amount | AmountMonthBefore | AmountMonthAfter |
---|---|---|---|---|
2022-01 | ライン番号の隣にある | 8 | - | 6 |
2022-02 | B | 3 | - | 4 |
2022-03 | ライン番号の隣にある | 6 | 8 | 6 |
2022-04 | B | 4 | 3 | 1 |
2022-05 | ライン番号の隣にある | 6 | 6 | 5 |
2022-06 | B | 1 | 4 | 5 |
2022-01 | ライン番号の隣にある | 5 | 6 | 7 |
2022-02 | B | 5 | 1 | 6 |
2022-03 | ライン番号の隣にある | 7 | 5 | 4 |
2022-04 | B | 6 | 5 | 8 |
2022-05 | ライン番号の隣にある | 4 | 7 | - |
2022-06 | B | 8 | 6 | - |
例 5
アプリにスクリプト例を追加して実行します。結果を表示するには、結果列に含まれている項目をアプリのシートに追加します。
結果
四半期 | 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 には、前の値が現在の値に追加される再帰呼び出しが含まれています。この演算子はスクリプト内の値の累積を計算するために使用されます。