예 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
예제 스크립트를 앱에 추가하고 실행합니다. 결과를 보기 위해 결과 열에 나열된 필드를 앱의 시트에 추가합니다.
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은 이전 값이 현재 값에 더해지는 재귀 호출을 포함합니다. 이 작업은 스크립트에서 값의 누적을 계산하는 데 사용됩니다.