不連続データと Intervalmatch
intervalmatch プレフィックスをLOAD または SELECT ステートメントで使用すると、不連続の数値が 1 つ以上の数値間隔にリンクされます。これはとても強力な機能であり、次の例のような実稼働環境などで使用できます。
次の 2 つのテーブルを見てください。最初のテーブルは、さまざまな注文 (Order) の製造の開始時刻 (Start) と終了時刻 (End) を示しています。2 つ目のテーブルには個々のイベントが含まれています。どの注文がイベントの影響を受けたか、どの注文がどのシフトで処理されたかを知るには、どのように個々のイベントを注文に関連付ければよいでしょうか。
スタート (Start) | End | 順序 |
---|---|---|
01:00 | 03:35 | A |
02:30 | 07:58 | B |
03:04 | 10:27 | C |
07:23 | 11:43 | D |
時刻 | イベント (Event) | コメント |
---|---|---|
00:00 | 0 | シフト 1 の開始 |
01:18 | 1 | ラインの停止 |
02:23 | 2 | ラインの再開 50% |
04:15 | 3 | ラインの速度 100% |
08:00 | 4 | シフト 2 の開始 |
11:43 | 5 | 製造の終了 |
まず、通常どおりに 2つのテーブルをロードします。次に、Time 項目を Start 項目と End 項目で定義される間隔にリンクします。
SELECT * from OrderLog;
SELECT * from EventLog;
Intervalmatch (Time) SELECT Start,End from OrderLog;
これで、以下のように QlikView でテーブルを作成できます。
主に注文 A がライン ストップ (Line stop) の影響を受けた一方で、ライン スピード (Line speed) の減少は注文 B と C にも影響を及ぼしたことが分かります。注文 C と D だけは、一部が Shift 2 で処理されました。
intervalmatch を使用する場合は、次の点に注意してください。
- intervalmatch ステートメントの前に、不連続データ ポイントを含む項目 (上の例では Time) が QlikView に読み取られている必要があります。intervalmatch ステートメントは、データベース テーブルからこの項目を読み取りません。
- intervalmatch LOAD または SELECT ステートメントで読み取られたテーブルは、厳密に 2 つの項目 (上記の例では、Start と End) を含んでいる必要があります。他の項目へのリンクを確立するには、間隔項目と共に、個別の LOAD または SELECT ステートメント (上記の例では最初の SELECT ステートメント) で他の項目を読み取る必要があります。
- 間隔は常に閉じているので、終端は間隔に含まれます。NULL の範囲は間隔を無限に拡張しますが、数値以外の範囲は間隔を無視します。
- 間隔は重なる場合があり、不連続値は一致する間隔すべてにリンクされます。
拡張された intervalmatch 構文を使用した穏やかに変化する軸 (SCD) 問題の解決
拡張された intervalmatch 構文を使用して、ソース データ内で穏やかに変化する軸 (SCD) の既知の問題を処理することができます。
サンプル スクリプト:
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 ステートメントはテーブル ファイルからデータを読み取る場合にのみ必要となります。NULL
IntervalTable からデータをロードすると、次のテーブルが生成されます。
キー | FirstDate | チーム |
---|---|---|
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 からデータをロードすると、次のテーブルが生成されます。
キー | [Name] (名前) | 日付 | 売上高 |
---|---|---|---|
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 に接続する合成キーで上記のキーを置き換えます。その結果、次のテーブルが生成されます。
キー | チーム | [Name] (名前) | FirstDate | LastDate | 日付 | 売上高 |
---|---|---|---|---|---|---|
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 |