간격과 불연속 데이터의 연결
LOAD 또는 SELECT 문에 intervalmatch 접두사를 사용하면 불연속 숫자 값을 하나 이상의 숫자 간격과 연결할 수 있습니다. 이는 아래 예와 같은 프로덕션 환경에서 사용할 수 있는 매우 강력한 기능입니다.
아래 두 테이블을 보십시오. 첫 번째 테이블에는 여러 주문의 생산 시작 날짜와 종료 날짜가 나와 있습니다. 두 번째 테이블에는 몇 가지 불연속 이벤트가 나와 있습니다. 생산 중단으로 영향을 받은 주문이나 특정 주문 제품을 생산한 근무조 등을 확인하기 위해 이러한 불연속 이벤트를 주문과 연결하려면 어떻게 해야 할까요?
시작 | End | 정렬 |
---|---|---|
01:00 | 03:35 | A |
02:30 | 07:58 | B |
03:04 | 10:27 | C |
07:23 | 11:43 | D |
시간 | 이벤트 | 주석 |
---|---|---|
00:00 | 0 | shift 1로 시작 |
01:18 | 1 | 라인 중단 |
02:23 | 2 | 라인 다시 시작 50% |
04:15 | 3 | 라인 속도 100% |
08:00 | 4 | shift 2로 시작 |
11:43 | 5 | 생산 종료 |
먼저 두 테이블을 일반적인 방법으로 로드하고 Time 필드를 Start 및 End:필드로 정의된 간격과 연결합니다.
SELECT * from OrderLog;
SELECT * from EventLog;
Intervalmatch (Time) SELECT Start,End from OrderLog;
이제 아래와 같이 QlikView에서 테이블을 만들 수 있습니다.
생산 라인 중단에 가장 큰 영향을 받은 것은 주문 A이지만 주문 B와 C의 경우에도 라인 속도 저하에 영향을 받았음을 손쉽게 확인할 수 있습니다. 주문 C와 D만 Shift 2에 의해 부분적으로 처리되었습니다.
intervalmatch를 사용할 때는 다음 사항에 주의하십시오.
- intervalmatch 문을 실행하기 전에 불연속 데이터 포인트(이 예에서는 Time)가 포함된 필드를 QlikView로 읽어와야 합니다. intervalmatch 문은 이 필드를 데이터베이스 테이블에서 읽지 않습니다.
- intervalmatch LOAD 또는 SELECT 문으로 읽은 테이블에는 항상 정확히 두 개의 필드(위 예에서는 Start 및 End)가 포함되어 있어야 합니다. 다른 필드에 대한 연결을 설정하려면 별도의 LOAD 또는 SELECT 문(위 예에서 첫 번째 SELECT 문)으로 추가 필드와 간격 필드를 함께 읽어야 합니다.
- 간격은 항상 완료된 상태입니다. 즉, 간격에는 종료 지점이 포함되어야 합니다. 제한이 숫자가 아닐 경우 간격이 무시되며(정의되지 않음), 제한이NULL일 경우 간격이 무기한으로(무제한) 확장됩니다.
- 간격은 겹칠 수 있으며 불연속 값은 일치하는 모든 간격에 연결됩니다.
확장된 intervalmatch 구문을 사용하여 느리게 변화하는 차원 문제 해결
확장된 intervalmatch 구문을 사용하여 잘 알려진 소스 데이터의 느리게 변화하는 차원 문제를 처리할 수 있습니다.
예제 스크립트:
SET NullInterpret='';
IntervalTable:
LOAD Key, ValidFrom, Team from IntervalTable.xls;
NullAsValue FirstDate,LastDate;
Key:
LOAD
Key,
ValidFrom as FirstDate,
date(if(Key=previous(Key),
previous(ValidFrom) - 1)) as LastDate,
Team
RESIDENT IntervalTable order by Key, ValidFrom desc;
drop table IntervalTable;
Transact:
LOAD Key, Name, Date, Sales from Transact.xls;
INNER JOIN intervalmatch (Date,Key) LOAD FirstDate, LastDate, Key RESIDENT Key;
누락된 값은 NULL 값이 아니라 빈 문자열로 정의되므로, nullinterpret 문은 테이블 파일에서 데이터를 읽어올 때만 필요합니다.
IntervalTable에서 데이터를 로드하면 다음과 같은 테이블이 생깁니다.
키 | 첫 번째 날짜 | 팀 |
---|---|---|
000110 | 2011-01-21 | Southwest |
000110 | - | Northwest |
000120 | - | Northwest |
000120 | 2013-03-05 | Southwest |
000120 | 2013-03-05 | Northwest |
000120 | 2013-01-06 | Southwest |
nullasvalue 문을 사용하여 NULL 값을 나열된 필드에 매핑할 수 있습니다.
previous 및 order by를 사용하여 Key, FirstDate, LastDate(특성 필드)를 만들면 나중에 IntervalTable이 이 키 테이블로 대체된 후 삭제됩니다.
Transact에서 데이터를 로드하면 다음과 같은 테이블이 생깁니다.
키 | 이름 | 날짜 | 판매 |
---|---|---|---|
000110 | Spengler Aaron | 2009-08-18 | 100 |
000110 | Spengler Aaron | 2009-12-25 | 200 |
000110 | Spengler Aaron | 2011-02-03 | 300 |
000110 | Spengler Aaron | 2011-05-05 | 400 |
000120 | Ballard John | 2011-06-04 | 500 |
000120 | Ballard John | 2013-01-20 | 600 |
000120 | Ballard John | 2013-03-10 | 700 |
000120 | Ballard John | 2013-03-13 | 800 |
000120 | Ballard John | 2013-09-21 | 900 |
inner join 다음에 나오는 intervalmatch 문은 Transact 테이블을 연결하는 가상 키로 위 키를 대체하여 다음과 같은 테이블을 만듭니다.
키 | 팀 | 이름 | 첫 번째 날짜 | 마지막 날짜 | 날짜 | 판매 |
---|---|---|---|---|---|---|
000110 | Northwest | Spengler Aaron | - | 2011-01-20 | 2009-08-18 | 100 |
000110 | Northwest | Spengler Aaron | - | 2011-01-20 | 2009-12-25 | 200 |
000110 | Southwest | Spengler Aaron | 2011-01-21 | - | 2011-02-03 | 300 |
000110 | Southwest | Spengler Aaron | 2011-01-21 | - | 2011-05-05 | 400 |
000120 | Northwest | Ballard John | - | 2013-01-05 | 2011-06-04 | 500 |
000120 | Southwest | Ballard John | 2013-01-06 | 2013-03-04 | 2013-01-20 | 600 |
000120 | Southwest | Ballard John | 2013-03-05 | - | 2013-03-10 | 700 |
000120 | Southwest | Ballard John | 2013-03-05 | - | 2013-03-13 | 800 |
000120 | Southwest | Ballard John | 2013-03-05 | - | 2013-09-21 | 900 |