Peek - 指令碼函數
Peek() 會傳回表格中已載入的列的欄位值。可以指定列號,也可以指定表格。若未指定列數,將會使用上一個載入的記錄。
peek() 函數通常用來在先前載入的表格中尋找相關邊界,亦即特定欄位的第一個值或最後一個值。在大部分情況下,此值儲存在變數中以供之後使用,例如作為 do-while 迴圈中的條件。
語法:
Peek(
field_name
[, row_no[, table_name ] ])
傳回的資料類型: 雙值
引數:
引數 | 描述 |
---|---|
field_name | 需要傳回值的欄位的名稱。輸入值必須指定為字串 (如引號中的常值)。 |
row_no | 指定所需欄位的表格中的列。可以是運算式,但是必須解析為整數。0 代表第一筆記錄,1 代表第二筆記錄,依此類推。負數表示從表格結尾算起的順序。-1 代表上次記錄讀取。 如未指定 row_no,則會採用 -1。 |
table_name | 沒有結束分號的表格標籤。如未指定 table_name,則會採用目前表格。若用於 LOAD 陳述式之外,或參考其他表格,則必須包括 table_name。 |
限制:
函數只能傳回來自已載入記錄的值。這表示,在第一個表格記錄中,使用 -1 作為 row_no 的呼叫將會傳回 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 |
FirstCode = 101,因為 Peek('EmployeeCode',0, 'EmployeeDates') 傳回表格 EmployeeDates 中 EmployeeCode 的第一個值。
LastCode = 106,因為 Peek('EmployeeCode',-1, 'EmployeeDates') 傳回表格 EmployeeDates 中 EmployeeCode 的最後一個值。
取代引數 row_no 的值會傳回表格中其他列的值,如下所示:
Peek('EmployeeCode',2, 'EmployeeDates') 傳回表格中的第三個值 103 作為 FirstCode。
然而,請注意,在這些範例中,如果未將表格指定為第三個引數 table_name,則函數會參考目前 (在此情況下,內部) 表格。
範例 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 中先前列內的欄位 ID。
Peek('List') 會參考表格 T2 中先前列內的欄位 List,目前建置為評估運算式。
評估陳述式如下:
如果 ID 的目前值與 ID 的前一個值相同,則寫入與 Value 的目前值串連的 Peek('List') 的值。否則,僅寫入 Value 的目前值。
如果 Peek('List') 已包含串連的結果,則 Peek('List') 的新結果將串連至其中。
範例 3
將範例指令碼新增至您的應用程式並予以執行。若要查看結果,將結果資料行中列出的欄位新增至您應用程式中的工作表。
金額 | 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 參數,以便使用預設值。在此範例中,下列三個函數呼叫等同:
- Peek(Amount)
- Peek(Amount,-1)
- Peek(Amount,-1,'Amounts')
使用 -1 作為 row_no 表示將會使用來自上一列的值。透過替代此值,可以擷取表格中其他列的值:
Peek(Amount,2) 傳回表格中的第三個值: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 的資料執行第二次傳遞。請注意 Order By 子句。這先按產品排序記錄,然後以遞增順序按月份排序。
需要 If() 函數,因為若上一列包含相同產品 (而非上個月) 的資料,則只能計算 AmountMonthBefore。藉由比較目前列的產品與上一列的產品,可驗證此條件。
建立第二個表格後,會使用 Drop Table 陳述式卸除第一個表格 tmp1Amounts。
最後,會透過資料進行第三次傳遞,但此時會以相反順序排序月份。以此方式,也能計算 AmountMonthAfter。
結果
月 | 產品 | 金額 | 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
將範例指令碼新增至您的應用程式並予以執行。若要查看結果,將結果資料行中列出的欄位新增至您應用程式中的工作表。
結果
季度 | 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 包括遞迴呼叫,其中先前的值會新增至目前的值。此操作用來計算指令碼中的累積值。