単一の日付からの日付間隔の作成

時間の間隔が明示的に開始および終了を含むことなく保存される場合があります。代わりに、変更タイムスタンプという 1 つの項目により暗黙のうちに定義されています。

複数の通貨の現在のレートを記載した下記のテーブルがある場合、各通貨レートの変化は新しい変換レートとともにそれぞれの行に表示されています。また、テーブルには最初に変換が実施される前の、当初の変換レートに対応する日付が空の行も含まれています。

Currency rates (通貨レート)
通貨 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

このテーブルは、重複しない間隔のセットを定義し、開始日は「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」を計算する 2 度目のデータ パススルーを実行します。現在のレコードに前のレコードとは異なる通貨がある場合、それは新しい通貨の最初のレコードとなる (だが間隔は最後) ため、手順 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;