기본 콘텐츠로 건너뛰기

인터 레코드 함수 사용: Peek, Previous 및 Exists

이 페이지에서

인터 레코드 함수 사용: Peek, PreviousExists

이 함수는 현재 레코드를 평가하기 위해 이전에 로드된 데이터 레코드의 값이 필요할 때 사용됩니다.

자습서의 이 부분에서는 Peek(), Previous()Exists() 함수를 사용해 봅니다.

Peek()

Peek()는 테이블에서 이미 로드되었거나 내부 메모리에 존재하는 행에 대한 필드 값을 찾습니다. 테이블처럼 행 번호를 지정할 수 있습니다.

Syntax:  

Peek(fieldname [ , row [ , tablename ] ] )

행은 정수여야 합니다. 0은 첫 번째 레코드, 1은 두 번째 레코드와 같은 식으로 이어집니다. 음수는 테이블 끝을 기준으로 한 순서를 나타냅니다. 1은 마지막으로 읽은 레코드를 나타냅니다.

행을 지정하지 않으면 -1로 가정됩니다.

Tablename은 끝 부분에 콜론이 없는 테이블 레이블입니다. tablename을 지정하지 않으면 현재 테이블이 사용됩니다. LOAD 문 외부에서 사용했거나 다른 테이블을 참조할 경우 tablename을 반드시 포함해야 합니다.

Previous()

Previous()where 절로 인해 무시되지 않은 이전 입력 레코드의 데이터를 사용하여 expr 표현식의 값을 찾습니다. 이 함수는 내부 테이블의 첫 번째 레코드에 대해 NULL을 반환합니다.

Syntax:  

Previous(expression)

Previous() 함수는 레코드에 더 심층적으로 액세스하기 위해 중첩될 수 있습니다. 입력 소스에서 데이터를 직접 가져오므로 관련 데이터베이스에 저장되지 않았더라도 Qlik Sense에 로드되지 않은 필드를 참조할 수 있습니다.

Exists()

Exists()는 특정 필드 값이 데이터 로드 스크립트의 필드에 이미 로드되었는지 여부를 판단합니다. 이 함수는 TRUE 또는 FALSE를 반환하므로 LOAD 문의 where 절 또는 IF 문에서 사용할 수 있습니다.

Syntax:  

Exists(field [, expression ] )

이 필드는 스크립트에 의해 현재까지 로드된 데이터에 존재해야 합니다. Expression은 지정된 필드에서 검색할 필드 값을 평가하는 표현식입니다. 생략하면 지정된 필드의 현재 레코드 값이 사용됩니다.

Peek()Previous() 사용

Peek()Previous()는 가장 간단한 형식으로, 테이블 내의 특정 값을 식별하는 데 사용됩니다. 다음은 이 연습에서 로드할 Employees 테이블의 샘플 데이터입니다.

Employees 테이블의 샘플 데이터
Date Hired Terminated
1/1/2011 6 0
2/1/2011 4 2
3/1/2011 6 1
4/1/2011 5 2

현재는 월, 고용 및 종료에 대한 데이터만 수집하므로 Peek()Previous() 함수를 사용하여 Employee CountEmployee Var에 대한 필드를 추가함으로써 총 직원의 월별 차이를 표시할 것입니다.

다음과 같이 하십시오.

  1. Advanced Scripting Tutorial 앱을 엽니다.
  2. 데이터 로드 편집기에서 새 스크립트 섹션을 추가합니다.
  3. Employees 섹션을 호출합니다.
  4. 오른쪽 메뉴의 DataFiles에서 데이터 선택을 클릭합니다.

  5. 업로드한 다음 Employees.xlsx를 선택합니다.
  6. 참고: Field names 아래에서, 데이터를 로드할 때 테이블 필드의 이름을 포함하도록 Embedded field names가 선택되어 있는지 확인합니다.
  7. 데이터 선택 창에서 스크립트 삽입을 클릭합니다.
  8. 스크립트는 다음과 같이 표시되어야 합니다.

    LOAD "Date", Hired, Terminated FROM [lib://DataFiles/Employees.xlsx] (ooxml, embedded labels, table is Sheet2);

  1. 이제 다음과 같도록 스크립트를 수정합니다.

    [Employees Init]:
    LOAD
        rowno() as Row,
        Date(Date) as Date,
        Hired,
        Terminated,
        If(rowno()=1, Hired-Terminated,  peek([Employee Count], -1)+(Hired-Terminated)) as [Employee Count]
    FROM [lib://DataFiles/Employees.xlsx]		
    (ooxml, embedded labels, table is Sheet2);

  2. Excel 시트에서 Date 필드의 날짜 형식은 MM/DD/YYYY입니다. 시스템 변수의 서식을 사용하여 날짜가 올바르게 해석되도록 Date 필드에 Date 함수가 적용됩니다.

    Peek() 함수를 사용하면 정의된 필드에 대해 로드된 모든 값을 식별할 수 있습니다. 이 표현식에서 먼저 rowno()가 1인지 확인합니다. 1인 경우에는 Employee Count가 존재하지 않으므로 Hired에서 Terminated를 뺀 차로 필드를 채웁니다.

    rowno()가 1보다 큰 경우에는 마지막 월의 Employee Count를 조회하고 해당 숫자를 해당 월의 Hired에서 Terminated 직원 수를 뺀 차이 값에 더합니다.

    Peek() 함수에서는 (-1)을 사용하고 있음도 알 수 있습니다. 이를 통해 Qlik Sense에 현재 레코드 위의 레코드를 조회하도록 알려줍니다. (-1)이 지정되지 않으면 Qlik Sense에서는 이전 레코드를 조회하는 것으로 간주합니다.

  1. 스크립트의 끝 부분에 다음을 추가합니다.
  2. [Employee Count]:
    LOAD
    	Row,
    	Date,
    	Hired,
    	Terminated,
    	[Employee Count],
    	If(rowno()=1,0,[Employee Count]-Previous([Employee Count])) as [Employee Var]
    Resident [Employees Init] Order By Row asc;
    Drop Table [Employees Init];

    Previous() 함수를 사용하면 정의된 필드에 대해 로드된 마지막 값을 식별할 수 있습니다. 이 표현식에서 먼저 rowno()가 1인지 확인합니다. 1인 경우에는 이전 월의 Employee Count에 대한 레코드가 없기 때문에 Employee Var이 없습니다. 따라서 값에 그냥 0을 입력합니다.

    rowno()가 1보다 큰 경우에는 Employee Var이 존재하는 것을 알고 있으므로 마지막 월의 Employee Count를 조회하고 해당 숫자를 현재 월의 Employee Count에서 빼서 Employee Var 필드의 값을 생성합니다.

    스크립트는 다음과 같이 표시되어야 합니다.

    [Employees Init]:
    LOAD
        rowno() as Row,
        Date(Date) as Date,
        Hired,
        Terminated,
        If(rowno()=1, Hired-Terminated,  peek([Employee Count], -1)+(Hired-Terminated)) as [Employee Count]
    FROM [lib://DataFiles/Employees.xlsx]
    (ooxml, embedded labels, table is Sheet2);
    
    [Employee Count]:
    LOAD
        Row,
        Date,
        Hired,
        Terminated,
        [Employee Count],
        If(rowno()=1,0,[Employee Count]-Previous([Employee Count])) as [Employee Var]
    Resident [Employees Init] Order By Row asc;	
    Drop Table [Employees Init];

  1. 데이터 로드를 클릭합니다.
  2. 앱 개요에서 새 시트에 Date, Hired, Terminated, Employee CountEmployee Var을 테이블 열로 사용하여 테이블을 만듭니다. 결과 테이블은 다음과 같습니다.

    스크립트에 PeekPrevious를 사용한 테이블
    Table following use of Peek and Previous in script.

Peek()Previous()를 사용하면 사용자가 테이블 내의 정의된 행을 대상으로 지정할 수 있습니다. 두 함수의 가장 큰 차이는 Peek() 함수를 사용하면 사용자가 이전에 스크립트에 로드되지 않은 필드를 볼 수 있는 반면 Previous() 함수는 이전에 로드된 필드만 조회할 수 있다는 점입니다. Previous()LOAD 문에 대한 입력에서 작동하지만 Peek()LOAD 문의 출력에서 작동합니다. (RecNo()RowNo()의 차이와 동일) 즉, Where 절이 있으면 두 함수가 다르게 동작합니다.

따라서 현재 값과 이전 값을 비교하여 표시해야 하는 경우에는 Previous() 함수가 더 적합할 수 있습니다. 예에서는 월별 직원 변동을 계산했습니다.

이전에 테이블에 로드되지 않은 필드를 대상으로 지정하거나 특정 행을 대상으로 지정해야 하는 경우에는 Peek() 함수가 더 적합할 수 있습니다. 이는 이전 월의 Employee Count를 조회하여 Employee Count를 계산한 후 현재 월에 대한 고용 및 종료 직원 간의 차를 더했던 예에서 알 수 있습니다. Employee Count는 원본 파일의 필드가 아님을 기억하십시오.

참고: Peek()Previous()를 사용하는 경우에 대한 자세한 내용은 Qlik Community의 블로그 게시물 Peek() vs Previous() – When to Use Each를 참조하십시오. 동작은 QlikView 컨텍스트로 설명됩니다. 그러나 논리는 Qlik Sense에 동일하게 적용됩니다.

Exists() 사용

Exists() 함수는 종종 관련 데이터가 데이터 모델에 이미 로드된 경우 데이터를 로드하기 위해 스크립트에서 Where 절과 함께 사용됩니다.

또한 다음 예에서는 Dual() 함수를 사용하여 문자열에 숫자 값을 할당합니다.

다음과 같이 하십시오.

  1. 새 앱을 만들고 이름을 지정합니다.
  2. 데이터 로드 편집기에서 새 스크립트 섹션을 추가합니다.
  3. People 섹션을 호출합니다.
  4. 다음 스크립트를 입력합니다.
  5. //Add dummy people data
    PeopleTemp:
    LOAD * INLINE [
    PersonID, Person
    1, Jane
    2, Joe
    3, Shawn
    4, Sue
    5, Frank
    6, Mike
    7, Gloria
    8, Mary
    9, Steven,
    10, Bill
    ];
     
    //Add dummy age data
    AgeTemp:
    LOAD * INLINE [
    PersonID, Age
    1, 23
    2, 45
    3, 43
    4, 30
    5, 40
    6, 32
    7, 45
    8, 54
    9,
    10, 61
    11, 21
    12, 39
    ];
     
    //LOAD new table with people
    People:
    NoConcatenate LOAD
        PersonID,
        Person
    Resident PeopleTemp;
     
    Drop Table PeopleTemp;
     
    //Add age and age bucket fields to the People table
    Left Join (People)
    LOAD
        PersonID,
        Age,
    	If(IsNull(Age) or Age='', Dual('No age', 5),
    	 If(Age<25, Dual('Under 25', 1),
    	  If(Age>=25 and Age <35, Dual('25-34', 2),
    	   If(Age>=35 and Age<50, Dual('35-49' , 3),
    	    If(Age>=50, Dual('50 or over', 4)
    	     ))))) as AgeBucket
    Resident AgeTemp
    Where Exists(PersonID);
     
    DROP Table AgeTemp;

  1. 데이터 로드를 클릭합니다.
  2. 스크립트에서는 PersonID가 데이터 모델에 이미 로드된 경우에만 AgeAgeBucket 필드가 로드됩니다.

    AgeTemp 테이블에는 PersonID 11 및 12에 대해 나열된 연령대가 있지만 이 ID들은 데이터 모델(People 테이블)에서 로드되지 않았으므로 Where Exists(PersonID) 절에 의해 제외됩니다. 또한 이 절은 다음과 같이 작성할 수도 있습니다. Where Exists(PersonID, PersonID).

    스크립트의 결과는 다음과 같습니다.

    스크립트에 Exists를 사용한 테이블
    Table following use of Exists in script.

    AgeTemp 테이블의 PersonID 중 데이터 모델로 로드된 것이 없다면 AgeAgeBucket 필드가 People 테이블에 조인되지 않았을 수 있습니다. Exists() 함수를 사용하면 데이터 모델에서 레코드/데이터가 분리되는 것, 즉 연결된 사람이 없는 AgeAgeBucket 필드를 방지할 수 있습니다.

  3. 새 시트를 만들고 이름을 지정합니다.
  4. 새 시트를 열고 편집을 클릭합니다.
  5. 차원 AgeBucket이 있는 시트에 일반 테이블을 추가하고 시각화 이름을 Age Groups로 지정합니다.
  6. 차원 AgeBucket 및 측정값 Count([AgeBucket])이 있는 시트에 막대형 차트를 추가합니다. 시각화 이름을 Number of people in each age group으로 지정합니다.
  7. 기본 설정에 따라 테이블 및 막대형 차트의 속성을 조정하고 완료를 클릭합니다.

    시트가 다음과 같이 표시됩니다.

    연령별로 그룹화된 시트
    Sheet with groupings by age.

Dual() 함수는 문자열에 숫자 값을 할당할 필요가 있는 경우 스크립트 또는 차트 표현식에서 유용합니다.

위 스크립트에 연령대를 로드하는 응용 프로그램이 있고 이 연령대를 버킷에 넣기로 했으므로 연령대 버킷과 실제 연령대 간의 비교에 기반하여 시각화를 만들 수 있습니다. 25세 미만, 25 ~ 35세 사이 등의 버킷이 있습니다. Dual() 함수를 사용하면 연령대 버킷에 숫자 값에 할당하여 나중에 목록 상자 또는 차트에서 연령대 버킷을 정렬하는 데 사용할 수 있습니다. 따라서 앱 시트에서와 같이 정렬에서도 목록 끝부분에 "No age"가 추가됩니다.

참고: Exists()Dual()에 대한 자세한 내용은 Qlik Community의 다음 블로그 게시물을 참조하십시오. Dual & Exists – Useful Functions(Dual & Exists – 유용한 함수)