配對間隔和離散資料

LOADSELECT 陳述式的 intervalmatch 前置詞是用於將離散數值連結到一或多個數值間隔。這是非常強大的功能,如以下範例所示,可用於生產環境。

Intervalmatch 範例

請見以下的兩個表格。第一個表格顯示各個訂單生產的開始和結束時間。第二個表格顯示一些離散事件。要如何將離散事件與訂單建立關聯,如此即可知道如哪些訂單受到干擾的影響,以及哪些訂單是由哪些輪班所處理的?

表格 OrderLog
開始 End 順序
01:00 03:35 A
02:30 07:58 B
03:04 10:27 C
07:23 11:43 D
表格 EventLog
時間 事件 註解
00:00 0 以排班 1 開始
01:18 1 產線停止
02:23 2 產線重新啟動 50%
04:15 3 產線速度 100%
08:00 4 以排班 2 開始
11:43 5 生產結束

首先照常載入這兩個表格,然後將欄位 Time 連結到由欄位 StartEnd 所定義的間隔:

SELECT * from OrderLog;

SELECT * from EventLog;

Intervalmatch (Time) SELECT Start,End from OrderLog;

您現在可以在 Qlik Sense 中建立如下的表格:

含有時間欄位的表格已連結至由開始和結束定義的時間間隔
時間 事件 註解 順序 開始 End
0:00 0 以排班 1 開始 - - -
1:18 1 產線停止 A 1:00 3:35
2:23 2 產線重新啟動 50% A 1:00 3:35
4:15 3 產線速度 100% B 2:30 7:58
4:15 3 產線速度 100% C 3:04 10:....
8:00 4 以排班 2 開始 C 3:04 10:....
8:00 4 以排班 2 開始 D 7:23 11:....
11:43 5 生產結束 E 7:23 11:.....

現在可清楚看到主要是訂單 A 受到生產線中止的影響,但生產線速度降低也影響到訂單 BC。只有訂單 CD 是部分由 Shift 2 處理的。

使用 intervalmatch 時請注意下列幾點:

  • intervalmatch 陳述式之前,Qlik Sense 必須已讀入包含離散資料點的欄位 (如上述範例中的 Time)。intervalmatch 陳述式並不會從資料庫表格讀取該欄位!
  • intervalmatch LOADSELECT 陳述式中讀取的表格一律必須包含剛好兩個欄位 (如上述範例中的 StartEnd)。若要建立其他欄位的連結,必須讀取間隔欄位以及在獨立的 LOADSELECT 陳述式中的其他欄位 (如上述範例中的第一個 SELECT 陳述式)。
  • 間隔一律為關閉。也就是說,結束點是包括在間隔內。非數值的限制會使得間隔被忽略 (未定義),而 NULL 限制會將間隔無限延伸 (無限制)。
  • 間隔可能會重疊,所以離散值會連結到所有符合的間隔。

使用延伸 intervalmatch 語法解決維度緩慢變化的問題

延伸 intervalmatch 語法可用於處理來源資料中維度緩慢變化的常見問題。

指令碼範例:

SET NullInterpret='';

 

IntervalTable:

LOAD Key, ValidFrom, Team

FROM 'lib://dataqv/intervalmatch.xlsx' (ooxml, embedded labels, table is IntervalTable);

 

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 'lib://dataqv/intervalmatch.xlsx' (ooxml, embedded labels, table is Transact);

 

INNER JOIN intervalmatch (Date,Key) LOAD FirstDate, LastDate, Key RESIDENT Key;

只有從表格檔案讀取資料時才需要 nullinterpret 陳述式,因為遺漏的值會定義為空字串,而不是 NULL 值。

IntervalTable 載入資料會產生下列表格:

Table with data loaded from IntervalTable
Key FirstDate Team
000110 2011-01-21 Southwest
000110 - Northwest
000120 - Northwest
000120 2013-03-05 Southwest
000120 2013-03-05 Northwest
000120 2013-03-05 Southwest

nullasvalue 陳述式可讓 NULL 值對應到列出的欄位。

透過使用 previousorder by 來建立 KeyFirstDateLastDate (屬性欄位),之後卸除 IntervalTable,並以此索引鍵表格取代。

Transact 載入資料會產生下列表格:

含有從 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 joinintervalmatch 陳述式會以連接至 Transact 表格的合成鍵取代以上的索引鍵,而產生下列表格:

含有前置 inner joinintervalmatch 陳述式的表格
索引碼 團隊 名稱 FirstDate LastDate 日期 鎖售額
000110 西北 Spengler Aaron - 2011-01-20 2009-08-18 100
000110 西北 Spengler Aaron - 2011-01-20 2009-12-25 200
000110 西南 Spengler Aaron 2011-01-21   2011-02-03 300
000110 西南 Spengler Aaron 2011-01-21   2011-05-05 400
000120 西北 Ballard John   2013-01-05 2011-06-04 500
000120 西南 Ballard John 2013-01-06 2013-03-04 2013-01-20 600
000120 西南 Ballard John 2013-03-05   2013-03-10 700
000120 西南 Ballard John 2013-03-05   2013-03-13 800
000120 西南 Ballard John 2013-03-05   2013-09-21 900