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