Corrispondenza tra intervalli e 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 funzionalità molto avanzata che può essere utilizzata, ad esempio, negli ambienti di produzione, come mostrato nell'esempio seguente.

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?

Tabella OrderLog
Inizio End Order
01:00 03:35 A
02:30 07:58 B
03:04 10:27 C
07:23 11:43 D
Tabella EventLog
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:

Tabella con il campo Time collegato agli intervalli definiti da Start ed End
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 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:

Table with data loaded from IntervalTable
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:

Tabella con dati caricati da Transact
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:

Tabella con l'istruzione intervalmatch preceduta da inner join
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