Skapa ett datumintervall från ett enskilt datum

Ibland lagras inte tidsintervallen med en explicit början och ett explicit slut. Istället impliceras de av endast ett fält, ändringstidsmarkören.

Det kan till exempel se ut som i tabellen nedan där du har valutakurser för flera olika valutor. Varje valutakursändring står på en egen rad, var och en med en ny omräkningskurs. Tabellen har även rader med tomma datum som motsvarar den ursprungliga valutakursen, innan den första ändringen skedde.

Tabellen definierar en uppsättning icke-överlappande intervall, där startdatumet kallas ”Change Date” och slutdatumet definieras av början på det efterföljande intervallet. Eftersom slutdatumet inte finns explicit lagrat i en egen kolumn måste vi skapa en sådan kolumn, så att den nya tabellen blir en lista över intervaller.

Gör följande:

  1. Skapa en fil med namnet Rates.xlsx som innehåller tabellen ovan och lagra den så att den är färdig att läsa in.
  2. Se till att datumen i Change Date-kolumnen har samma format som det lokala datumformatet.

  3. Bestäm vilket tidsintervall du vill arbeta med. Början på intervallet måste infalla före det första datumet i dina data och intervallets slut måste infalla efter det sista.
  4. Läs in källdata, men ändra de tomma datumen till början på intervallet som definieras i föregående punkt. Ändringsdatumet ska läsas in som ”From Date”.
  5. Sortera tabellen, först efter Currency och sedan efter ”From Date” i fallande ordning, så att du får de senaste datumen högst upp.
  6. Kör ett andra pass på dina data där du beräknar ”To Date”. Om den aktuella posten har en annan valuta än den förra posten innebär det att det är den första posten med en ny valuta (men dess sista intervall), så du ska använda slutet på intervallet som definieras i steg 1. Om det är samma valuta ska du ta ”From Date” från den föregående posten, subtrahera en liten tidsmängd och använda detta värde som ”To Date” i den aktuella posten.

Skriptet nedan uppdaterar källtabellen på följande sätt:

QlikView-skriptet ser ut så här:

Let vBeginTime = Num('1/1/2013');
Let vEndTime = Num('1/3/2013');
Let vEpsilon = Pow(2,-27);
Tmp_Rates:
LOAD Currency, Rate,
Date(If(IsNum([Change Date]), [Change Date], $(#vBeginTime))) as FromDate
From 'C:\MyFiles\Rates.xlsx'
(ooxml, embedded labels, table is Sheet1);
 
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;

 

När det här skriptet körs får du en tabell med en korrekt lista över intervallen.

Tabellen kan sedan användas för att jämföra med ett befintligt datum med hjälp av Intervalmatch-metoderna.