Creazione di un intervallo di date da una data singola

Talvolta gli intervalli di tempo non vengono memorizzati in modo esplicito con un inizio e una fine. Vengono invece dedotti da un unico campo, l'indicatore temporale della modifica.

Come, ad esempio, nella tabella seguente che contiene tassi relativi a più valute. Ogni modifica del tasso di valuta si trova su una riga specifica, ognuna con un nuovo tasso di conversione. La tabella contiene inoltre righe con date vuote che corrispondono al tasso di conversione iniziale, prima che venga apportata la prima modifica.

Tassi delle valute
Currency Change Date Rate
EUR - 8.59
EUR 28/01/2013 8.69
EUR 15/02/2013 8.45
USD - 6.50
USD 10/01/2013 6.56
USD 03/02/2013 6.30

Questa tabella definisce una serie di intervalli che non si sovrappongono, in cui la data di inizio viene denominata "Change Date" e le data di fine viene definita dall'inizio dell'intervallo seguente. Tuttavia, dato che la data di fine non è stata memorizzata esplicitamente in una colonna separata, occorre creare tale colonna in modo che la nuova tabella diventi un elenco di intervalli.

In questo esempio di script, la tabella In_Rates viene creata da un caricamento inline. Assicurarsi che il formato delle date nella colonna Change Date sia identico a quello del formato della data locale.

In_Rates: LOAD * Inline [ Currency,Change Date,Rate EUR,,8.59 EUR,28/01/2013,8.69 EUR,15/02/2013,8.45 USD,,6.50 USD,10/01/2013,6.56 USD,03/02/2013,6.30 ];

Procedere come indicato di seguito:

  1. Stabilire l'intervallo temporale con cui si desidera lavorare. L'inizio dell'intervallo deve essere impostato prima della prima data nei dati, mentre la fine dell'intervallo deve essere impostata dopo l'ultima data.

    Let vBeginTime = Num('1/1/2013');
    Let vEndTime = Num('1/3/2013');
    Let vEpsilon = Pow(2,-27);
  1. Caricare i dati sorgente, ma modificare le date vuote all'inizio dell'intervallo definite nel punto precedente. La data della modifica deve essere caricata come "From Date".

    Ordinare la tabella prima di tutto in base a Currency, quindi in base a "From Date" in ordine decrescente in modo che le date più recenti si trovino nella parte superiore.

    Tmp_Rates:
    LOAD Currency, Rate,
    Date(If(IsNum([Change Date]), [Change Date], $(#vBeginTime))) as FromDate
    Resident In_Rates;
  2. Eseguire un secondo passaggio sui dati in cui si calcola "To Date". Se il record attuale presenta una valuta diversa rispetto al record precedente, si tratta del primo record di una nuova valuta (ma del suo ultimo intervallo), quindi occorre utilizzare la fine dell'intervallo definito durante il passaggio 1. Se si tratta della stessa valuta, dal valore "From Date" del record precedente, sottrarre una quantità di tempo ridotta e utilizzare questo valore come "To Date" nel record attuale.

    Rates:
    LOAD Currency, Rate, FromDate,
    Date(If( Currency=Peek('Currency'),
    Peek('FromDate') - $(#vEpsilon),
    $(#vEndTime)
    )) as ToDate
    Resident Tmp_Rates
    Order By Currency, FromDate Desc;
  3. Rilasciare la tabella di input e la tabella temporanea.

    Drop Table Tmp_Rates;

Lo script elencato di seguito aggiornerà la tabella sorgente nel modo seguente:

Tabella sorgente aggiornata
Currency Rate FromDate ToDate
EUR 8.45 15/02/2013 vEndTime
EUR 8.69 28/01/2013 14/02/2013 23:59:59
EUR 8.59 vBeginTime 28/01/2013 23:59:99
USD 6.30 03/02/2013 vEndTime
USD 6.56 10/01/2013 2/02/2013 23:59:59
USD 6.50 vBeginTime 9/01/2013 23:59:59

Quando si esegue lo script, verrà visualizzata una tabella che contiene gli intervalli corretti. Utilizzare la sezione Anteprima del sistema di visualizzazione modello dati per visualizzare la tabella risultante.

Anteprima dei dati
Currency Rate FromDate ToDate
EUR 8.45 15/02/2013 01/03/2013
EUR 8.69 28/01/2013 14/02/2013
EUR 8.59 01/01/2013 28/01/2013
USD 6.30 03/02/2013 01/03/2013
USD 6.56 10/01/2013 2/02/2013
USD 6.50 01/01/2013 9/01/2013

Successivamente, questa tabella potrà essere utilizzata per confrontare una data esistente utilizzando i metodi Intervalmatch.

Example:  

L'intero script Qlik Sense ha il seguente aspetto:

Let vBeginTime = Num('1/1/2013');
Let vEndTime = Num('1/3/2013');
Let vEpsilon = Pow(2,-27);
 
In_Rates: LOAD * Inline [ Currency,Change Date,Rate EUR,,8.59 EUR,28/01/2013,8.69 EUR,15/02/2013,8.45 USD,,6.50 USD,10/01/2013,6.56 USD,03/02/2013,6.30 ];
 
 
Tmp_Rates:
LOAD Currency, Rate,
Date(If(IsNum([Change Date]), [Change Date], $(#vBeginTime))) as FromDate
Resident In_Rates;
 
Rates:
LOAD Currency, Rate, FromDate,
Date(If( Currency=Peek('Currency'),
Peek('FromDate') - $(#vEpsilon),
$(#vEndTime)
)) as ToDate
Resident Tmp_Rates
Order By Currency, FromDate Desc;
 
Drop Table Tmp_Rates;