Peek()는 이미 로드된 행에 대한 테이블의 필드 값을 반환합니다. 테이블처럼 행 번호를 지정할 수 있습니다. 행 번호를 지정하지 않으면 이전에 마지막으로 로드된 레코드가 사용됩니다.
peek() 함수는 이전에 로드된 테이블, 즉 특정 필드의 첫 번째 값 또는 마지막 값에서 관련 경계를 찾는 데 가장 자주 사용됩니다. 대부분의 경우 이 값은 나중에 사용할 수 있도록 변수에 저장됩니다(예: do-while 루프의 조건).
구문:
Peek(
field_name
[, row_no[, table_name ] ])
반환 데이터 유형: dual
인수:
인수
인수
설명
field_name
반환 값이 필요한 필드의 이름입니다.입력 값은 문자열(예: 따옴표로 묶은 리터럴)로 지정해야 합니다.
row_no
테이블에서 필수 필드를 지정하는 행입니다. 표현식을 사용할 수 있지만 정수로 처리해야 합니다. 0은 첫 번째 레코드, 1은 두 번째 레코드와 같은 식으로 이어집니다. 음수는 테이블 끝을 기준으로 한 순서를 나타냅니다. 1은 마지막으로 읽은 레코드를 나타냅니다.
row_no를 지정하지 않으면 -1이 사용됩니다.
table_name
끝 부분에 콜론이 없는 테이블 레이블. table_name을 지정하지 않으면 현재 테이블이 사용됩니다. LOAD 문 외부에서 사용하거나 다른 테이블을 참조할 경우 table_name을 반드시 포함해야 합니다.
제한 사항:
이 함수는 이미 로드된 레코드의 값만 반환할 수 있습니다. 즉, 테이블의 첫 번째 레코드에서 -1을 row_no로 사용하는 호출은 NULL을 반환합니다.
예 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
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
월
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')
row_no로 -1을 사용하면 이전 행의 값이 사용됩니다. 이 값을 대체하여 테이블의 다른 행 값을 가져올 수 있습니다.
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가 이전 행에 동일한 제품이지만 이전 달에 대한 데이터가 포함된 경우에만 계산되어야 하기 때문에 필요합니다. 현재 행의 제품과 이전 행의 제품을 비교하여 이 조건의 유효성을 검사할 수 있습니다.
두 번째 테이블이 만들어질 때 첫 번째 테이블 tmp1Amounts는 Drop Table 문을 사용하여 삭제됩니다.
마지막으로 세 번째 패스가 데이터를 통해 이루어지지만 이제는 월이 역순으로 정렬됩니다. 이런 식으로 AmountMonthAfter도 계산할 수 있습니다.
정보 메모Order by 절은 테이블이 정렬되는 방식을 지정합니다. 이러한 절이 없으면 Peek() 함수는 내부 테이블에 있는 임의의 순서를 사용하므로 예측할 수 없는 결과가 발생할 수 있습니다.
결과
결과 테이블
월
제품
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
예제 스크립트를 앱에 추가하고 실행합니다. 결과를 보기 위해 결과 열에 나열된 필드를 앱의 시트에 추가합니다.