Einordnung diskreter Werte in Intervalle
Der Zusatz intervalmatch vor den Befehlen LOAD oder SELECT dient dazu, diskrete numerische Werte in numerische Intervalle einzuordnen. Nachfolgend wird diese Funktion am Beispiel eines Produktionsprozesses erläutert.
Beispiel:
Bitte betrachten Sie die zwei nachstehenden Tabellen. Die erste Tabelle zeigt Bearbeitungsstart und -ende verschiedener Aufträge. Die zweite Tabelle enthält punktuelle Ereignisse. Wie lässt sich nun ein Zusammenhang zwischen den Tabellen herstellen, in dem Sinn, dass erkennbar wird, welche Aufträge von welchen Ereignissen betroffen waren?
Starten Sie . | End | Ebene |
---|---|---|
01:00 | 03:35 | A |
02:30 | 07:58 | B |
03:04 | 10:27 | C |
07:23 | 11:43 | D |
Time | Ereignis | Kommentar |
---|---|---|
00:00 | 0 | Start von Schicht 1 |
01:18 | 1 | Linienstopp |
02:23 | 2 | Linienneustart 50% |
04:15 | 3 | Liniengeschwindigkeit 100% |
08:00 | 4 | Start von Schicht 2 |
11:43 | 5 | Produktionsende |
Laden Sie zuerst die beiden Tabellen wie üblich und verknüpfen Sie dann das Feld Time mit den durch die Felder Start und End definierten Intervalle:
SELECT * from OrderLog;
SELECT * from EventLog;
Intervalmatch (Time) SELECT Start,End from OrderLog;
Sie können jetzt wie folgt eine Tabelle in QlikView erstellen:
Jetzt ist offensichtlich, dass hauptsächlich Auftrag A vom Stopp der Produktionslinie betroffen war. Auftrag B und C wurden ebenfalls durch die verminderte Geschwindigkeit der Produktionslinie beeinträchtigt. Nur die Aufträge C und D wurden teilweise von Shift 2 bearbeitet.
Beim Gebrauch von intervalmatch beachten Sie Folgendes:
- Vor dem Befehl intervalmatch muss das Feld mit den diskreten Werten (Time in unserem Beispiel) bereits in QlikView eingelesen worden sein. Das Feld wird nicht durch intervalmatch eingelesen!
- Die Tabelle, die durch intervalmatch LOAD oder SELECT geladen wird, muss genau zwei Felder enthalten (Start und End in unserem Beispiel). Um Verknüpfungen mit anderen Feldern zu ermöglichen, muss das Feld mit den diskreten Werten zusammen mit anderen Feldern in einer separaten LOAD- oder SELECT-Anweisung (die erste SELECT-Anweisung im obigen Beispiel) geladen werden.
- Die Intervalle sind abgeschlossen, das heißt die Grenzwerte sind in den Intervallen enthalten. Nicht-numerische Werte als Intervallgrenzen führen dazu, dass das Intervall nicht berücksichtigt wird (undefiniert). Bei NULL-Werten als Intervallgrenzen ist das Intervall unbegrenzt (unendlich groß).
- Wenn sich die Intervalle überschneiden, werden die Werte jedem passenden Intervall zugeordnet.
Behebung von Problemen mit sich langsam verändernden Dimensionen mit der erweiterten Syntax von intervalmatch
Die Syntax des erweiterten Befehls intervalmatch dient dazu, ein häufig vorkommendes Problem zu lösen: sich langsam verändernde Dimensionen in den Datenquellen.
Beispiel:
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;
nullinterpret wird nur benötigt, wenn die Daten aus einer Tabellendatei eingelesen werden, denn dort sind fehlende Werte als leere Strings statt als NULL-Werte definiert.
Das Einlesen von IntervalTable liefert folgende Tabelle:
Taste | FirstDate | Team |
---|---|---|
000110 | 2011-01-21 | Southwest |
000110 | - | Northwest |
000120 | - | Northwest |
000120 | 2013-03-05 | Southwest |
000120 | 2013-03-05 | Northwest |
000120 | 2013-01-06 | Southwest |
Der Befehl nullasvalue erlaubt das Mapping von NULL-Werten auf die gelisteten Felder.
Nun werden die Attributfelder Key, FirstDate, LastDate generiert, und zwar mithilfe der Befehle previous und order by. Danach wird die Tabelle IntervalTable gelöscht. Sie wird durch diese Schlüsseltabelle ersetzt.
Das Einlesen von Transact liefert folgende Tabelle:
Taste | Name | Date | Vertrieb |
---|---|---|---|
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 |
Durch den Befehl intervalmatch mit dem vorausgehenden Zusatz inner join wird der Schlüssel durch einen neuen, synthetisch generierten Schlüssel ersetzt, der sich mit der Tabelle Transact verknüpft. Damit ergibt sich folgende Tabelle:
Taste | Team | Name | FirstDate | LastDate | Date | Vertrieb |
---|---|---|---|---|---|---|
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 |