# 不連続データと間隔の一致

intervalmatch プレフィックスを LOAD または SELECT ステートメントで使用すると、不連続の数値が 1 つ以上の数値間隔にリンクされます。これはとても有用な機能で、実稼働環境などで使用できます。



## Intervalmatch の例

次の 2 つのテーブルを見てください。最初のテーブルは、さまざまな注文 (Order) の製造の開始時刻 (Start) と終了時刻 (End) を示しています。2 つ目のテーブルには個々のイベントが含まれています。どの注文がイベントの影響を受けたか、どの注文がどのシフトで処理されたかを知るには、どのように離散したイベントを注文に関連付ければよいでしょうか。

テーブル 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 | 稼働終了 |

まず、通常通り 2 つのテーブルをロードし、次に、項目 Start および End によって定義される間隔に項目 Time をリンクします。

`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% の再開 | プ | 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 ステートメントの前に、不連続データ ポイントを含む項目 (上の例では Time) が Qlik Sense に読み取られている必要があります。intervalmatch ステートメントは、データベース テーブルからこの項目を読み取りません。
* intervalmatch LOAD または SELECT ステートメントで読み取られたテーブルは、厳密に 2 つの項目 (上記の例では、Start と End) を含んでいる必要があります。他の項目へのリンクを確立するには、個別の LOAD または SELECT ステートメントで、間隔項目を追加項目とともに読み込む必要があります (上記の例の最初の SELECT ステートメント)。
* 間隔は常に閉じています。つまり、終端は間隔に含まれます。NULL の範囲は間隔を無限に拡張しますが、数値以外の範囲は間隔を無視します。
* 間隔は重なる場合があり、不連続値は一致する間隔すべてにリンクされます。

## 拡張された intervalmatch 構文を使用した穏やかに変化する軸 (SCD) 問題の解決

拡張された intervalmatch 構文を使用して、ソース データ内で穏やかに変化する軸 (SCD) の既知の問題を処理できます。

### サンプル スクリプト:

`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;`

欠損値は NULL 値ではなく空の文字列として定義されるため、nullinterpret はテーブル ファイルからデータを読み取る場合にのみ必要となります。

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 からロードされたデータを含むテーブル

| Key | Name | Date | Sales |
| --- | --- | --- | --- |
| 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 に接続する合成キーで上記のキーを置き換えます。その結果、次のテーブルが生成されます。

inner joininner join に続く intervalmatchintervalmatch ステートメントを含むテーブル

| Key | Team | Name | FirstDate | LastDate | Date | Sales |
| --- | --- | --- | --- | --- | --- | --- |
| 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 |