從單一日期建立日期間隔
部分已儲存的時間間隔沒有明確的開始和結束。它們僅使用一個欄位暗示 - 變更時間戳記。
它可以如下表中所示,其中包含多種貨幣的貨幣匯率。每種貨幣匯率的變更都載於自己的列上;每種都具有新的兌換率。此外,在進行第一次變更之前,表格包含一些列,具有對應於初始兌換率的空日期。
= Currency | 匯率 | 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 |
此表格會定義一組非重疊間隔,其中開始日期稱為 “Change Date”,結束日期由下列間隔的開始進行定義。但是因為結束日期未明確地儲存在其自己的資料行中,所以我們需要建立此類資料行,以便新表格將變成間隔清單。
請執行下列動作:
- 建立名為 Rates.xlsx 的檔案,其中包含上方顯示的表格,并儲存它以備進行載入。
- 判定您想要使用的時間範圍。範圍的開始必須在資料中的第一個日期之前,並且範圍的結束必須在最後一個日期之後。
- 載入來源資料,但是將空的日期變更為前一個要點中所定義範圍的開始日期。變更日期應該載入為「From Date」。
- 首先根據 Currency 排序表格,然後根據「From Date」以遞減順序排序,確保您讓最新的日期位於頂部。
- 執行第二次通過資料,您在其中計算「To Date」。如果目前記錄的貨幣與前一筆記錄不同,則它是新貨幣的第一筆記錄 (但為最後一個間隔),因此您應該使用步驟 1 中定義的範圍結束。若這是相同的貨幣,您應從先前的記錄中取用「From Date」,減去少量時間,並使用此值作為目前記錄中的「To Date」。
確保 Change Date 資料列中的日期格式與本機日期格式相同。
下方列出的指令碼將使用下列方式更新來源表格:
= 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:59 |
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 |
QlikView 指令碼如下所示:
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;
當執行此指令碼時,您將獲得具有正確間隔的表格。
後續此表格可用於透過 Intervalmatch 方法,與現有日期進行比較。