単一の日付からの日付間隔の作成
時間の間隔が明示的に開始および終了を含むことなく保存される場合があります。代わりに、変更タイムスタンプという 1 つの項目により暗黙のうちに定義されています。
複数の通貨の現在のレートを記載した下記のテーブルがある場合、各通貨レートの変化は新しい変換レートとともにそれぞれの行に表示されています。また、テーブルには最初に変換が実施される前の、当初の変換レートに対応する日付が空の行も含まれています。
通貨 | 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 と呼ばれ終了日は次の間隔の開始点によって定義されています。しかし、終了日が専用の列に明示的に保存されていないため、そのような列を作成し、新しいテーブルが間隔のリストとなるようにする必要があります。
次の手順を実行します。
- 新しいアプリを作成し、名前を付けます。
- データ ロード エディターで新しいスクリプト セクションを追加します。
- 次のインライン テーブルを追加します。Change Date 列の日付がローカル日付書式と同じ書式になっていることを確認します。
-
参照する時間幅を決定します。その時間幅の開始点は、日付の最初の日の前であり、終了点は最終日の後でなければなりません。
スクリプトの一番上に以下を追加します。
Let vBeginTime = Num('1/1/2013'); Let vEndTime = Num('1/3/2013'); Let vEpsilon = Pow(2,-27);
-
ソース データをロードし、空の日付を前の手順で定義した時間幅の開始点に変更します。変更した日付は、"From Date" としてロードする必要があります。
まず Currency に応じてテーブルをソートしますが、最新の日付が一番上に来るように "From Date" を降順でソートします。
次の In_Rates テーブルを追加します。
Tmp_Rates: LOAD Currency, Rate, Date(If(IsNum([Change Date]), [Change Date], $(#vBeginTime))) as FromDate Resident In_Rates;
-
"To Date" を計算する 2 度目のデータ パススルーを実行します。現在のレコードに前のレコードとは異なる通貨がある場合、それは新しい通貨の最初のレコードとなる (だが間隔は最後) ため、手順 1 で定義した時間幅の終了日を使用する必要があります。通貨が同一の場合は、前のレコードの "From Date" を取得して時間の小さい単位を差し引き、この値を現在のレコードの "To Date" として使用します。
次の Tmp_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;
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
];
これで、スクリプトは次のようになります。
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;
スクリプトは、次の方法でソース テーブルを更新します。
通貨 | 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 メソッドを使用することにより、既存の日付との比較にこのテーブルを使用することができます。