Overeenkomende intervallen voor discrete gegevens
Het prefix intervalmatch bij een LOAD- of SELECT-opdracht wordt gebruikt om discrete numerieke waarden aan een of meer numerieke intervallen te koppelen. Dit is een zeer krachtige functie die u bijvoorbeeld in productieomgevingen kunt gebruiken, zoals in het volgende voorbeeld.
Voorbeeld:
Kijk naar de twee tabellen verderop. De eerste tabel toont het begin en eind van de productie van verschillende orders. De tweede tabel toont enkele discrete gebeurtenissen. Hoe zorgen we voor een associatie tussen de discrete gebeurtenissen en de bestellingen, om bijvoorbeeld uit te zoeken welke bestellingen last hadden van storingen en welke bestellingen door welke ploegen zijn verwerkt?
Start | End | Volgorde |
---|---|---|
01:00 | 03:35 | A |
02:30 | 07:58 | B |
03:04 | 10:27 | C |
07:23 | 11:43 | D |
Tijd | Gebeurtenis | Opmerking |
---|---|---|
00:00 | 0 | Start van dienst 1 |
01:18 | 1 | Lijn stoppen |
02:23 | 2 | Lijn opnieuw starten 50% |
04:15 | 3 | Lijn snelheid 100% |
08:00 | 4 | Start van dienst 2 |
11:43 | 5 | Einde productie |
Laad eerst de twee tabellen zoals gebruikelijk, koppel vervolgens het veld Time aan de intervallen die zijn gedefinieerd door de velden Start en End:
SELECT * from OrderLog;
SELECT * from EventLog;
Intervalmatch (Time) SELECT Start,End from OrderLog;
U kunt nu een tabel maken in QlikView zoals hieronder wordt weergegeven:
Nu kunnen we duidelijk zien dat hoofdzakelijk bestelling A gevolgen ondervond van het stoppen van de band, maar dat de verminderde snelheid van de band ook gevolgen had voor bestelling B en C. Alleen de bestellingen C en D zijn gedeeltelijk afgehandeld door Shift 2.
Houd rekening met het volgende als u intervalmatch gebruikt:
- Vóór de intervalmatch-opdracht moet het veld met de discrete gegevenspunten (Time in het bovenstaande voorbeeld) al in QlikView zijn gelezen. De intervalmatch-opdracht leest dit veld niet zelf uit de databasetabel.
- De tabel die wordt gelezen in de intervalmatch LOAD- of SELECT-opdracht moet altijd exact twee velden bevatten (Start en End in het voorbeeld hierboven). Voor het vormen van een koppeling met andere velden moet u de intervalvelden samen lezen met extra velden in een afzonderlijke LOAD- of SELECT-opdracht (de eerste SELECT-opdracht in het bovenstaande voorbeeld).
- De intervallen zijn altijd gesloten, dat wil zeggen dat de eindpunten in het interval zijn opgenomen. Bij niet-numerieke limieten wordt het interval genegeerd (ongedefinieerd) en bij NULL-limieten wordt het interval tot oneindig uitgebreid (onbeperkt).
- De intervallen kunnen elkaar overlappen en de discrete waarden worden aan alle relevante intervallen gekoppeld.
De uitgebreide syntaxis van intervalmatch gebruiken om problemen met langzaam veranderende dimensies op te lossen
Met de uitgebreide intervalmatch-syntaxis kunt u bekende problemen met langzaam veranderende dimensies in brongegevens oplossen.
Voorbeeldscript:
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;
De opdracht nullinterpret is alleen vereist bij het lezen van gegevens uit een tabelbestand, aangezien ontbrekende waarden als lege tekenreeksen worden gedefinieerd in plaats van als NULL-waarden.
Het laden van de gegevens uit IntervalTable resulteert in de volgende tabel:
Sleutel | Eerste datum | Team |
---|---|---|
000110 | 2011-01-21 | Zuidwesten |
000110 | - | Noordwesten |
000120 | - | Noordwesten |
000120 | 2013-03-05 | Zuidwesten |
000120 | 2013-03-05 | Noordwesten |
000120 | 2013-01-06 | Zuidwesten |
Door de nullasvalue-opdracht kunnen NULL-waarden aan de genoemde velden worden toegewezen.
Maak Key, FirstDate, LastDate, (kenmerkvelden) met behulp van previous en order by, waarna IntervalTable wordt verwijderd en vervangen door deze sleuteltabel.
Het laden van de gegevens uit Transact resulteert in de volgende tabel:
Sleutel | Naam | Datum | Verkoop |
---|---|---|---|
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 |
De intervalmatch-opdracht voorafgegaan door inner join vervangt de bovenstaande sleutel door een synthetische sleutel die met de tabel Transact is gekoppeld en de volgende tabel oplevert:
Sleutel | Team | Naam | Eerste datum | Laatste datum | Datum | Verkoop |
---|---|---|---|---|---|---|
000110 | Noordwesten | Spengler Aaron | - | 2011-01-20 | 2009-08-18 | 100 |
000110 | Noordwesten | Spengler Aaron | - | 2011-01-20 | 2009-12-25 | 200 |
000110 | Zuidwesten | Spengler Aaron | 2011-01-21 | - | 2011-02-03 | 300 |
000110 | Zuidwesten | Spengler Aaron | 2011-01-21 | - | 2011-05-05 | 400 |
000120 | Noordwesten | Ballard John | - | 2013-01-05 | 2011-06-04 | 500 |
000120 | Zuidwesten | Ballard John | 2013-01-06 | 2013-03-04 | 2013-01-20 | 600 |
000120 | Zuidwesten | Ballard John | 2013-03-05 | - | 2013-03-10 | 700 |
000120 | Zuidwesten | Ballard John | 2013-03-05 | - | 2013-03-13 | 800 |
000120 | Zuidwesten | Ballard John | 2013-03-05 | - | 2013-09-21 | 900 |