# Peek - 指令碼函數

Peek() 會傳回表格中已載入的列的欄位值。可以指定列號，也可以指定表格。若未指定列數，將會使用上一個載入的記錄。

`Peek()` 函數通常用來在先前載入的表格中尋找相關邊界，亦即特定欄位的第一個值或最後一個值。在大部分情況下，此值儲存在變數中以供之後使用，例如作為 do-while 迴圈中的條件。

語法：

Peek(

field\_name

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

傳回的資料類型： 雙值

引數：

引數

| 引數 | 描述 |
| --- | --- |
| field\_name | 需要傳回值的欄位的名稱。輸入值必須指定為字串 (如引號中的常值)。 |
| row\_no | 指定所需欄位的表格中的列。可以是運算式，但是必須解析為整數。0 代表第一筆記錄，1 代表第二筆記錄，依此類推。負數表示從表格結尾算起的順序。-1 代表上次記錄讀取。<br><br>如未指定 row\_no，則會採用 -1。 |
| table\_name | 沒有結束分號的表格標籤。如未指定 table\_name，則會採用目前表格。若用於 LOAD 陳述式之外，或參考其他表格，則必須包括 table\_name。 |

限制：

函數只能傳回來自已載入記錄的值。這表示，在第一個表格記錄中，使用 -1 作為 `row_no` 的呼叫將會傳回 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 |

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() 時重新排序。

將範例指令碼新增至您的應用程式並予以執行。若要查看結果，將結果資料行中列出的欄位新增至您應用程式中的工作表。

```
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 中先前列內的欄位 ID。  
`Peek('List')` 會參考表格 T2 中先前列內的欄位 List，目前建置為評估運算式。

評估陳述式如下：  
如果 ID 的目前值與 ID 的前一個值相同，則寫入與 Value 的目前值串連的 Peek('List') 的值。否則，僅寫入 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 參數，以便使用預設值。在此範例中，下列三個函數呼叫等同：

* Peek(金額)
* Peek(金額,-1)
* Peek(金額,-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。

資訊備註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/zh-TW/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/table-labels.htm)
* [Previous - 指令碼函數](https://help.qlik.com/zh-TW/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/InterRecordFunctions/Previous.htm)