# 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?

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 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:

Table with data loaded from IntervalTableIntervalTable

| 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 TransactTransact

| 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 intervalmatchintervalmatch preceduta da inner joininner 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 |