Corrispondenza degli intervalli con i dati discreti
Il prefisso intervalmatch in un'istruzione LOAD o SELECT viene utilizzato per collegare valori numerici discreti a uno o più intervalli numerici. Si tratta di una funzione molto avanzata che può essere utilizzata, ad esempio, negli ambienti di produzione.
Esempio di Intervalmatch
Osservare le due tabelle seguenti. La prima tabella mostra l'inizio e la fine della produzione di ordini differenti. La seconda tabella mostra alcuni eventi discreti. Come è possibile associare gli eventi discreti agli ordini, affinché si sappia, ad esempio, quali ordini sono interessati dalle interruzioni e quali sono stati elaborati da determinati turni?
Inizio | End | Order |
---|---|---|
01:00 | 03:35 | A |
02:30 | 07:58 | B |
03:04 | 10:27 | C |
07:23 | 11:43 | D |
Time | Event | Commento |
---|---|---|
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 |
Si caricheranno dapprima le due tabelle nel modo consueto, quindi si collegherà il campo Time agli intervalli definiti dai campi Start e End:
SELECT * from OrderLog;
SELECT * from EventLog;
Intervalmatch (Time) SELECT Start,End from OrderLog;
In Qlik Sense è ora possibile creare una casella della tabella come illustrato di seguito:
Time | Event | Commento | Order | Inizio | End |
---|---|---|---|---|---|
0:00 | 0 | Start of shift 1 | - | - | - |
1:18 | 1 | Line stop | A | 1:00 | 3:35 |
2:23 | 2 | Line restart 50% | A | 1:00 | 3:35 |
4:15 | 3 | Line speed 100% | B | 2:30 | 7:58 |
4:15 | 3 | Line speed 100% | C | 3:04 | 10:.... |
8:00 | 4 | Start of shift 2 | C | 3:04 | 10:.... |
8:00 | 4 | Start of shift 2 | D | 7:23 | 11:.... |
11:43 | 5 | End of production | E | 7:23 | 11:..... |
In questo modo si vede facilmente come sia stato soprattutto l'ordine A a essere stato compromesso dall'interruzione della linea, ma che la riduzione della velocità della linea ha esercitato un impatto anche sugli ordini B e C. Solo gli ordini C e D sono stati parzialmente gestiti da Shift 2.
Quando si utilizza l'istruzione intervalmatch, tenere presente i punti seguenti:
- Prima dell'istruzione intervalmatch il campo contenente i punti di dati discreti (Time nell'esempio riportato sopra) deve essere già stato letto in Qlik Sense. L'istruzione intervalmatch non legge questo campo dalla tabella del database.
- La tabella letta nell'istruzione intervalmatch LOAD o SELECT deve sempre contenere esattamente due campi (Start ed End nell'esempio precedente). Per stabilire un collegamento con altri campi, è necessario leggere i campi di intervallo insieme ai campi aggiuntivi in un'istruzione LOAD o SELECT separata (la prima istruzione SELECT nell'esempio precedente).
- Gli intervalli sono sempre chiusi, vale a dire che i punti estremi sono inclusi nell'intervallo. Un intervallo con limiti non numerici verrà ignorato (non definito), mentre limiti NULL estendono l'intervallo in modo indefinito (illimitato).
- Gli intervalli possono sovrapporsi e i valori discreti saranno collegati a tutti gli intervalli corrispondenti.
Uso della sintassi di intervalmatch estesa per risolvere i problemi del cambiamento lento delle dimensioni
La sintassi intervalmatch estesa può essere utilizzata per gestire il noto problema delle dimensioni che cambiano lentamente nei dati sorgente.
Script di esempio:
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;
L'istruzione nullinterpret è necessaria solo quando si leggono i dati da un file tabellare, perché i valori mancanti sono definiti come stringhe vuote, anziché come valori NULL.
Il caricamento dei dati da IntervalTable restituisce la tabella seguente:
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 |
L'istruzione nullasvalue consente il mapping tra valori NULL e i campi elencati.
Si creano i campi di attributo Key, FirstDate e LastDate utilizzando previous e order by, quindi si esegue il DROP di IntervalTable, che è stata ormai sostituita da questa tabella chiave.
Il caricamento dei dati da Transact restituisce la tabella seguente:
Key | Nome | 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 |
L'istruzione intervalmatch preceduta da inner join sostituisce la chiave precedente con una chiave sintetica che si collega alla tabella Transact, restituendo la tabella seguente:
Key | Team | Nome | 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 |