從單一日期建立日期間隔

有時,儲存時間間隔時沒有明確提供開始時間和結束時間。相反,它們只藉助一個欄位來暗指 - 變更時間戳記。

這種情況可能如下表所示,您對多種貨幣設有不同的匯率。每種貨幣匯率只在它自己的列裡變更,分別帶有一個新的兌換率。另外,在第一次變更之前,表格含有對應於初始兌換率的空日期列。

貨幣匯率
貨幣 換匯日期 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」,結束日期由後續時間間隔的開始日期定義。但由於結束日期並未明確地儲存在自己的資料行中,所以我們需要建立這樣一個資料行,使新表格成為一個時間間隔清單。

在此指令碼範例中,表格 In_Rates 由內嵌載入建立。確保 Change Date 資料行中的日期採用與本機日期相同的格式。

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 ];

請執行下列動作:

  1. 確定您想要使用的時間範圍。範圍的開始時間必須在資料的第一個日期之前,範圍的結束時間必須在最後一個日期之後。

    Let vBeginTime = Num('1/1/2013');
    Let vEndTime = Num('1/3/2013');
    Let vEpsilon = Pow(2,-27);
  1. 載入來源資料,但將空日期變更為在前一個要點提示中定義的範圍起始時間。變更日期應被載入作為「From Date」。

    首先根據 Currency 排列表格,然後根據「From Date」降序排列,這樣最新的日期位於最頂部。

    Tmp_Rates:
    LOAD Currency, Rate,
    Date(If(IsNum([Change Date]), [Change Date], $(#vBeginTime))) as FromDate
    Resident In_Rates;
  2. 對您計算「To Date」的資料執行第二次排序通過。如果當前記錄中的貨幣與先前記錄的貨幣不同,那麼它是新貨幣的第一個記錄 (但不是它的最後一個時間間隔),因此您應使用在第 1 步中定義的範圍結束時間。若這是相同的貨幣,您應從先前的記錄採取「From Date」,減去少量的時間,然後使用此值作為目前記錄中的「To Date」。

    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. 拖放輸入表格和臨時表格。

    Drop Table Tmp_Rates;

下列指令碼會按以下方式更新來源表格:

已更新的來源表格
貨幣 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

當執行指令碼時,您將會得到一個正確列出時間間隔的表格。使用資料模型檢視器的預覽區段檢視產生的表格。

資料預覽
貨幣 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

此表格隨後可用於採用 Intervalmatch 方法與現有日期進行對比。

Example:  

完整的 Qlik Sense 指令碼如下所示:

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;