# 配對間隔和離散資料

LOAD 或 SELECT 陳述式的 intervalmatch 前置詞是用於將離散數值連結到一或多個數值間隔。這是非常強大的功能，例如可用於生產等環境中。



## Intervalmatch 範例

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

表格 OrderLog

| 開始 | 結束 | 順序 |
| --- | --- | --- |
| 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 連結到由欄位 Start 和 End 所定義的間隔：

`SELECT * from OrderLog;` `SELECT * from EventLog;` `Intervalmatch (Time) SELECT Start,End from OrderLog;`

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

時間欄位連結到由開始和結束定義之間隔的表格

| 時間 | 事件 | 註解 | 順序 | 開始 | 結束 |
| --- | --- | --- | --- | --- | --- |
| 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 受到生產線中止的影響，但生產線速度降低也影響到訂單 B 和 C。只有訂單 C 和 D 是部分由 Shift 2 處理的。

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

* 在 intervalmatch 陳述式之前，Qlik Sense 必須已讀入包含離散資料點的欄位 (如上述範例中的 Time)。intervalmatch 陳述式並不會從資料庫表格讀取該欄位。
* 在 intervalmatch LOAD 或 SELECT 陳述式中讀取的表格一律必須包含剛好兩個欄位 (如上述範例中的 Start 和 End)。為了建立與其他欄位的連結，您必須在獨立的 LOAD 或 SELECT 陳述式中讀取間隔欄位以及其他欄位 (上述範例中的第一個 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 IntervalTableIntervalTable

| 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 值對應到列出的欄位。

透過使用 previous 和 order by 來建立 Key、FirstDate、LastDate (屬性欄位)，之後卸除 IntervalTable，並以此索引鍵表格取代。

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

從 TransactTransact 載入資料的表格

| 金鑰 | 名稱 | 日期 | 鎖售額 |
| --- | --- | --- | --- |
| 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 表格的合成鍵取代以上的索引鍵，而產生下列表格：

intervalmatchintervalmatch 陳述式前面是 inner joininner join 的表格

| 金鑰 | 團隊 | 名稱 | 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 |