기본 콘텐츠로 건너뛰기

간격 일치 및 반복 로드

LOAD 또는 SELECT 문에 Intervalmatch 접두사를 사용하면 불연속 숫자 값을 하나 이상의 숫자 간격과 연결할 수 있습니다. 이는 프로덕션 환경에서 사용할 수 있는 매우 강력한 기능입니다.

IntervalMatch() 접두사 사용

가장 기본적인 간격 일치는 한 테이블에 숫자 또는 날짜(이벤트)의 목록이 있고 두 번째 테이블에 간격의 목록이 있는 경우입니다. 두 테이블을 연결하는 것이 목적입니다. 일반적으로 이것은 다대다 관계이므로, 하나의 간격에 많은 날짜가 속해 있을 수 있으며 하나의 날짜가 여러 간격에 속할 수도 있습니다. 이 문제를 해결하기 위해서는 두 원본 테이블 사이에 브리지 테이블을 만들어야 합니다. 이 작업은 여러 방법으로 수행할 수 있습니다.

Qlik Sense에서 이 문제를 해결하는 가장 간단한 방법은 LOAD 또는 SELECT 문 앞에 IntervalMatch() 접두사를 사용하는 것입니다. LOAD/SELECT 문에는 간격을 정의하는 두 개의 필드인 FromTo만 포함되어야 합니다. 그러면 IntervalMatch() 접두사가 로드된 간격과 접두사에 대한 파라메타로 지정된 이전에 로드된 숫자 필드 사이의 모든 조합을 생성합니다.

다음과 같이 하십시오.

  1. 새 앱을 만들고 이름을 지정합니다.
  2. 데이터 로드 편집기에서 새 스크립트 섹션을 추가합니다.
  3. Events 섹션을 호출합니다.
  4. 오른쪽 메뉴의 DataFiles에서 데이터 선택을 클릭합니다.

  5. 업로드한 다음 Events.txt를 선택합니다.
  6. 데이터 선택 창에서 스크립트 삽입을 클릭합니다.
  7. 업로드한 다음 Intervals.txt를 선택합니다.
  8. 데이터 선택 창에서 스크립트 삽입을 클릭합니다.
  9. 스크립트에서 첫 번째 테이블 이름을 Events로 지정하고 두 번째 테이블은 Intervals로 지정합니다.
  10. 스크립트의 끝에 IntervalMatch를 추가하여 처음 두 테이블을 연결하는 세 번째 테이블을 만듭니다.
  11. BridgeTable: IntervalMatch (EventDate) LOAD distinct IntervalBegin, IntervalEnd Resident Intervals;
  12. 스크립트는 다음과 같이 표시되어야 합니다.
  13. Events: LOAD EventID, EventDate, EventAttribute FROM [lib://DataFiles/Events.txt] (txt, utf8, embedded labels, delimiter is '\t', msq);   Intervals: LOAD IntervalID, IntervalAttribute, IntervalBegin, IntervalEnd FROM [lib://DataFiles/Intervals.txt] (txt, utf8, embedded labels, delimiter is '\t', msq);   BridgeTable: IntervalMatch (EventDate) LOAD distinct IntervalBegin, IntervalEnd Resident Intervals;

  14. 데이터 로드를 클릭합니다.
  15. 데이터 모델 뷰어를 엽니다. 데이터 모델은 다음과 같이 표시됩니다.
  16. 데이터 모델: Events, BridgeTable, Intervals$Syn1 테이블
    Data model: Events, BridgeTable, Intervals, and $Syn1 tables.

    데이터 모델에는 자체적으로 Qlik Sense 가상 키로 증명될 복합 키(IntervalBeginIntervalEnd 필드)가 포함됩니다.

    기본 테이블은 다음과 같습니다.

    • 이벤트당 정확히 하나의 레코드를 포함하는 Events 테이블.
    • 간격당 정확히 하나의 레코드를 포함하는 Intervals 테이블.
    • 이벤트 및 간격의 조합당 정확히 하나의 레코드가 포함되고 두 이전 테이블을 연결하는 브리지 테이블.

    간격이 중첩되는 경우는 하나의 이벤트가 여러 간격에 속할 수 있습니다. 또한 간격은 당연히 이에 속하는 여러 이벤트를 가질 수 있습니다.

    이 데이터 모델은 정규화되고 소형이라는 점에서 최적입니다. Events 테이블 및 Intervals 테이블은 모두 변경되지 않으며 원래 레코드 수를 포함합니다. 이들 테이블에서 수행되는 모든 Qlik Sense 계산(예: Count(EventID))은 올바르게 작동 및 평가됩니다.

참고: IntervalMatch()에 대한 자세한 내용은 Qlik Community에서 다음 블로그 게시물을 참조하십시오. Using IntervalMatch()(IntervalMatch() 사용)

While 루프 및 반복 로드 IterNo() 사용

간격의 하위 및 상위 경계 사이의 열거 가능한 값을 생성하는 While 루프 및 IterNo()를 사용하여 거의 동일한 브리지 테이블을 만들 수 있습니다.

LOAD 문 내의 루프는 While 절을 사용하여 만들 수 있습니다. 예:

LOAD Date, IterNo() as Iteration From … While IterNo() <= 4;

이러한 LOAD 문은 각 입력 레코드에 따라 반복되며 While 절의 표현식이 참인 동안 반복해서 로드합니다. IterNo() 함수는 첫 번째 반복 시 “1”을 반환하고 두 번째 반복 시 “2”를 반환하는 식으로 계속 이어집니다.

간격에 대한 기본 키인 IntervalID가 있으므로 스크립트에서의 유일한 차이는 브리지 테이블을 만드는 방법뿐입니다.

다음과 같이 하십시오.

  1. 기존 Bridgetable 문을 다음 스크립트로 바꿉니다.
  2. BridgeTable: LOAD distinct * Where Exists(EventDate); LOAD IntervalBegin + IterNo() - 1 as EventDate, IntervalID Resident Intervals While IntervalBegin + IterNo() - 1 <= IntervalEnd;

  3. 데이터 로드를 클릭합니다.
  4. 데이터 모델 뷰어를 엽니다. 데이터 모델은 다음과 같이 표시됩니다.
  5. 데이터 모델: Events, BridgeTableIntervals 테이블
    Data model: Events, BridgeTable, and Intervals tables.

    일반적으로 세 개의 테이블이 있는 솔루션이 가장 좋은데, 간격과 이벤트 사이의 다대다 관계를 허용하기 때문입니다. 그러나 대게 하나의 이벤트가 하나의 단일 간격에만 속할 수 있다고 알고 있습니다. 이 경우 브리지 테이블은 실제로 필요하지 않습니다. IntervalID는 이벤트 테이블에 직접 저장할 수 있습니다. 이렇게 하려면 여러 가지 방법이 있지만 BridgetableEvents 테이블과 조인하는 방법이 가장 유용합니다.

  6. 스크립트의 끝 부분에 다음 스크립트를 추가합니다.
  7. Join (Events) LOAD EventDate, IntervalID Resident BridgeTable; Drop Table BridgeTable;

  8. 데이터 로드를 클릭합니다.
  9. 데이터 모델 뷰어를 엽니다. 데이터 모델은 다음과 같이 표시됩니다.
  10. 데이터 모델: EventsIntervals 테이블
    Data model: Events and Intervals tables.

열린 간격 및 닫힌 간격

간격이 열려 있는지 또는 닫혀 있는지는 종료 지점이 간격에 포함되어 있는지 여부에 의해 결정됩니다.

  • 복수의 종료 지점이 포함되어 있으면 닫힌 간격입니다.
  • [a,b] = {x ∈ ℝ ∣ a ≤ x ≤ b}

  • 복수의 종료 지점이 포함되어 있지 않으면 열린 간격입니다.
  • ]a,b[ = {x ∈ ℝ ∣ a < x < b}

  • 종료 지점 하나가 포함되어 있으면 반만 열린 간격입니다.
  • [a,b[ = {x ∈ ℝ ∣ a ≤ x < b}

간격이 중첩되고 숫자가 둘 이상의 간격에 속할 수 있는 경우에는 보통 닫힌 간격을 사용해야 합니다.

그러나 간격을 중첩시키지 않으려는 경우에는 숫자가 하나의 간격에만 속하도록 하려고 할 수 있습니다. 따라서 한 지점이 한 간격의 끝이고 동시에 다음 간격의 시작인 경우에 문제가 생깁니다. 이 값에 있는 숫자는 양쪽 간격에 모두 속하게 됩니다. 따라서 반만 열린 간격이 필요합니다.

이 문제에 대한 실질적인 솔루션은 모든 간격의 종료 값에서 약간을 빼서 닫힌 간격을 만들어 간격이 중첩되지 않도록 하는 것입니다. 숫자가 날짜인 경우는 가장 간단한 방법이 해당 날짜의 마지막 밀리초를 반환하는 DayEnd() 함수를 사용하는 것입니다.

Intervals: LOAD…, DayEnd(IntervalEnd – 1) as IntervalEnd From Intervals;

수동으로 작은 양을 뺄 수도 있습니다. 그렇게 하는 경우, 연산에서 52개의 유효 이진 숫자(14개의 십진 숫자)로 올림 처리되므로 빼는 양이 너무 작지 않도록 하십시오. 너무 작은 양을 사용하면 차이를 식별할 수 없어서 원래 숫자를 다시 사용하게 됩니다.