例 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;
結果のテーブル従業員コード | 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 | リスト | 値 |
---|
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 | 月 |
---|
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() 関数は内部テーブルの任意の順序を使用するため、予期しない結果が生じる可能性があります。
結果
結果のテーブル月 | 製品 | 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
アプリにスクリプト例を追加して実行します。結果を表示するには、結果列に含まれている項目をアプリのシートに追加します。
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;
結果
結果のテーブル四半期 | 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 には、前の値が現在の値に追加される再帰呼び出しが含まれています。この演算子はスクリプト内の値の累積を計算するために使用されます。