Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
お世話になっております。
データの取り込み処理で詰まってしまい、お知恵を借りたく質問いたしました。
下図のように日付をもつトランザクションのテーブル(出荷明細テーブル)と、
トランザクションテーブルに対して適用日を持つマスタ(単価適用テーブル)があります。
分析のために、1つのテーブルにしようとロードスクリプトで試行錯誤したのですが、
上手な結合方法がわからず、今に至っています。
適用日と出荷日の関係では、製品の出荷日の直前(出荷日含む)の適用日の単価がその製品の単価となります。
最終的には一番したのテーブルのように結合したいと考えています。
よい結合方法につきまして、ぜひアドバイスお願いいたします。
■単価適用テーブル
製品 | 適用日 | 単価 |
---|---|---|
A | 2012/6/1 | 10 |
A | 2012/7/1 | 15 |
B | 2012/6/15 | 20 |
B | 2012/8/10 | 30 |
■出荷明細テーブル
製品 | 出荷日 | 数 |
---|---|---|
A | 2012/7/1 | 10 |
A | 2012/7/20 | 20 |
B | 2012/8/1 | 10 |
上記2つの表から、以下のようなデータとして取り扱いたいと考えています。
製品 | 出荷日 | 数 | 単価 |
---|---|---|---|
A | 2012/7/1 | 10 | 15 |
A | 2012/7/20 | 20 | 15 |
B | 2012/8/1 | 10 | 20 |
数行追加しました。
単価適用テーブル:
LOAD * INLINE [
A製品,適用日,単価
A,2012/07/01,15
A,2012/06/01,10
B,2012/08/10,30
B,2012/06/15,20];
単価適用開始終了テーブル:
LOAD
A製品 As A1製品,
適用日 As 適用開始日,
if(previous(A製品)=A製品,date(previous(適用日)-1,'YYYY/MM/DD'),date(makedate(2999,12,31),'YYYY/MM/DD')) As 適用終了日,
単価 As 単価2
Resident 単価適用テーブル;
Drop Table 単価適用テーブル;
単価適用テーブル:
LOAD
A1製品 As A製品,
適用開始日,
適用終了日,
単価2 As 単価
Resident 単価適用開始終了テーブル;
Drop Table 単価適用開始終了テーブル;
出荷明細テーブル:
LOAD * INLINE [
B製品,出荷日,数
A,2012/07/01,10
A,2012/07/20,20
B,2012/08/01,10];
left join(出荷明細テーブル)
IntervalMatch( 出荷日,B製品 )
load
適用開始日 As 適用開始日2,
適用終了日 As 適用終了日2,
A製品 As B製品
Resident 単価適用テーブル;
//*** ↓↓ 今回追加
left join(出荷明細テーブル)
load
適用開始日 As 適用開始日2,
適用終了日 As 適用終了日2,
A製品 As B製品,
単価
Resident 単価適用テーブル;
DROP Field 適用開始日2,適用終了日2;
RENAME Field B製品 to 製品;
DROP Table 単価適用テーブル;
単価適用開始(&終了)テーブルの作り方からの全ソースは下記になります。
//******* START
単価適用テーブル:
LOAD * INLINE [
A製品,適用日,単価
A,2012/07/01,15
A,2012/06/01,10
B,2012/08/10,30
B,2012/06/15,20];
単価適用開始終了テーブル:
LOAD
A製品 As A1製品,
適用日 As 適用開始日,
if(previous(A製品)=A製品,date(previous(適用日)-1,'YYYY/MM/DD'),date(makedate(2999,12,31),'YYYY/MM/DD')) As 適用終了日,
単価 As 単価2
Resident 単価適用テーブル;
Drop Table 単価適用テーブル;
単価適用テーブル:
LOAD
A1製品 As A製品,
適用開始日,
適用終了日,
単価2 As 単価
Resident 単価適用開始終了テーブル;
Drop Table 単価適用開始終了テーブル;
出荷明細テーブル:
LOAD * INLINE [
B製品,出荷日,数
A,2012/07/01,10
A,2012/07/20,20
B,2012/08/01,10];
left join(出荷明細テーブル)
IntervalMatch( 出荷日,B製品 )
load
適用開始日 As 適用開始日2,
適用終了日 As 適用終了日2,
A製品 As B製品
Resident 単価適用テーブル;
tsuyoshi様
返信おそくなりすみません。
詳細なアドバイスありがとうございます。大変助かります。
前段previousにつきましては、リンク先も含め内容を理解しました。
(peek,previousの使い方など参考になります)
また、日中考えていたソースとほぼ同じ内容で安心しました。
--
後段のIntervalMatchについてマニュアルを読んで概要は理解したのですが、
上記サンプルスクリプトの結果から、結合イメージがつきません。
すみません。IntervalMatch使用後のデータソースイメージが沸かず。。。
不明な点は、上記スクリプトを実行した際のテーブルビューアです。
出荷明細テーブルと単価適用テーブルが存在しているのですが、紐つきがないように見えます。
(サンプルスクリプト実行後のテーブルビューアを添付します)
添付はサンプルスクリプト実行時のものですが、出荷明細と単価が紐づいているのでしょうか?
すみませんが、もう少しお付き合いください。
最終的には、私の最初の書き込みの一番下のテーブルを目指しています。
数行追加しました。
単価適用テーブル:
LOAD * INLINE [
A製品,適用日,単価
A,2012/07/01,15
A,2012/06/01,10
B,2012/08/10,30
B,2012/06/15,20];
単価適用開始終了テーブル:
LOAD
A製品 As A1製品,
適用日 As 適用開始日,
if(previous(A製品)=A製品,date(previous(適用日)-1,'YYYY/MM/DD'),date(makedate(2999,12,31),'YYYY/MM/DD')) As 適用終了日,
単価 As 単価2
Resident 単価適用テーブル;
Drop Table 単価適用テーブル;
単価適用テーブル:
LOAD
A1製品 As A製品,
適用開始日,
適用終了日,
単価2 As 単価
Resident 単価適用開始終了テーブル;
Drop Table 単価適用開始終了テーブル;
出荷明細テーブル:
LOAD * INLINE [
B製品,出荷日,数
A,2012/07/01,10
A,2012/07/20,20
B,2012/08/01,10];
left join(出荷明細テーブル)
IntervalMatch( 出荷日,B製品 )
load
適用開始日 As 適用開始日2,
適用終了日 As 適用終了日2,
A製品 As B製品
Resident 単価適用テーブル;
//*** ↓↓ 今回追加
left join(出荷明細テーブル)
load
適用開始日 As 適用開始日2,
適用終了日 As 適用終了日2,
A製品 As B製品,
単価
Resident 単価適用テーブル;
DROP Field 適用開始日2,適用終了日2;
RENAME Field B製品 to 製品;
DROP Table 単価適用テーブル;
tsuyoshi様
お世話になります。
再度ご返信いただきありがとうございます。
結論から申しますと、上記方法で期待する値が取れました!
今朝方追記いただきました、「//*** ↓↓ 今回追加 」で気づきましたが、
昨日時点で単価適用テーブルと出荷明細テーブルの紐付けができていましたね。
私の上記添付でもしっかり適用開始日「2」がありました。。
(適用開始日 As 適用開始日2で2を見落としていました。)
IntervalMatchについてはマニュアルを読んでも、いまいち実行結果がつかめず
上記サンプルは大変参考になりました。
このたびは有難うございました。
どういたしまして。私もintervalmatchが始め分かりませんでした・・・ これって第5キーまで定義できるみたいなので非常に強力ですね