Länka diskreta data till intervall
Prefixet intervalmatch framför en LOAD- eller SELECT-sats används för att länka diskreta numeriska värden till ett eller flera numeriska intervall. Detta är en mycket kraftfull funktion, som kan användas i exempelvis produktionsmiljö som i exemplet nedan.
Exempel:
Betrakta tabellerna nedan. Den första tabellen visar början och slut på produktionen av olika order. Den andra tabellen visar några diskreta händelser. Hur kan de diskreta händelserna associeras till angivna order, så att du till exempel får reda på vilka order som påverkades av störningarna och vilka order som behandlades i vilka skift?
Start | End | Placering |
---|---|---|
01:00 | 03:35 | A |
02:30 | 07:58 | B |
03:04 | 10:27 | C |
07:23 | 11:43 | D |
Time | Händelse | Kommentar |
---|---|---|
00:00 | 0 | Start of shift 1 |
01:18 | 1 | Line stop |
02:23 | 2 | Line restart 50% |
04:15 | 3 | Line speed 100% |
08:00 | 4 | Start of shift 2 |
11:43 | 5 | End of production |
Börja med att ladda de två tabellerna som vanligt och länka sedan fältet Time till intervallen som definieras av fälten Start och End:
SELECT * from OrderLog;
SELECT * from EventLog;
Intervalmatch (Time) SELECT Start,End from OrderLog;
Nu kan du skapa en tabell i QlikView enligt nedan:
Nu kan vi enkelt se att framför allt order A påverkades av tillverkningsstoppet, men att den minskade hastigheten även påverkade order B och C. Endast order C och D hanterades delvis av Shift 2.
Notera följande punkter vid användning av intervalmatch:
- Innan intervalmatch-satsen läses in måste fältet som innehåller de diskreta datapunkterna (Time i exemplet ovan) redan ha lästs in i QlikView. intervalmatch-satsen läser inte in dessa fält från databastabellen!
- Tabellen som läses in via intervalmatch LOAD eller SELECT-satsen måste alltid innehålla exakt två fält (Start och End i exemplet ovan. För att skapa en länkning till andra fält måste intervallfälten läsas in tillsammans med ytterligare fält via en separat LOAD- eller SELECT-sats (den första SELECT-satsen i exemplet ovan).
- Intervallen är alltid slutna, d.v.s. start-och slutpunkt är alltid inkluderade i intervallet. Om icke-numeriska gränser används ignoreras intervallet (betraktas som odefinierat). Om däremot NULL-gränser används utökas intervallet i all oändlighet (betraktas som obegränsat).
- Intervallen kan överlappa varandra. De diskreta värdena länkas då till alla passande intervall.
Användning av utökad intervalmatch-syntax för att lösa problem med långsamt förändrade dimensioner
Den utökade intervalmatch-syntaxen kan användas för att hantera det välkända problemet med långsamt förändrade dimensioner i källdata.
Skriptexempel:
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;
Satsen nullinterpret behövs bara vid inläsning av data från tabellfiler eftersom saknade värden anges som tomma strängar istället för som NULL-värden.
Inläsning av data från IntervalTable ger följande resultat:
Key | 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 |
Med nullasvalue-satsen kan man mappa NULL-värdena till de listade fälten.
Skapa Key, FirstDate, LastDate, (attributfält) med hjälp av previous och order by. Därefter försvinner IntervalTable eftersom den har ersatts av denna nyckeltabell.
Inläsning av data från Transact ger följande resultat:
Key | Namn | Datum | 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 |
intervalmatch-satsen följd av inner join ersätter nyckeln ovan med en syntetisk nyckel som kopplar till Transact-tabellen. Resultatet blir som följer.
Key | Team | Namn | FirstDate | LastDate | Datum | 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 |