LoginSignup
2
0

More than 1 year has passed since last update.

@OFFSETをSQLプッシュバックさせる(Db2版)

Last updated at Posted at 2022-11-15

SPSS Modelerで@OFFSETはSQLプッシュバックが行えない関数として代表的なものです。
これをSQLプッシュバックさせる方法を考えてみます。これは、産業技術総合研究所 本田様に教えていただいたアイディアをDb2のDB関数も使って実装したものです。

  • テスト環境

    • Modeler 18.4
    • Db2 warehouse on cloud
  • サンプルストリーム

  • サンプルデータ

用意したデータは以下のように顧客ごと日付ごとに購入金額と購入点数が記録されています。

image.png

ここから1回前のトランザクションの購入金額と購入点数の列を@OFFSETで追加します。

1. @OFFSETでの実現

まず、@OFFSETでの実現方法を確認しておきます。
CUSTID(顧客ID)とDATE(購入日)でソートします。
image.png

「フィールド作成」ノードで同じCUSTID(顧客ID)の1回前のAMOUNT(購入額)、NUMPURCHASE(購入点数)の値を取得しています。
image.png

以下のようにひとつ前トランザクションの値を取得できます。これで前回からの購入金額の差などを計算することができます。

image.png

しかし、@OFFSETがSQLプッシュバックしません。
image.png

2. SQLプッシュバックの実現

「フィールド作成」ノードでSYSIBM.ROWNUMBERを選びます。そしてCUSTIDでパーティション化して、DATEでソートして連番を振ります。
image.png

以下のようにCUSTIDごとにDATE順に連番が振られます(RDBの処理なので順序は保証されません。この表示と同じ準にするためにはCUSTIDとDATEでソートをして確認してください)。

image.png

内部的には以下のSQLがプッシュバックされています。

SYSIBM.ROWNUMBER() 
OVER( PARTITION BY T0.CUSTID ORDER BY T0."DATE" ASC) AS NUM

次に「置換」ノードで今作ったNUMに1足したデータを作ります。
image.png

そして、これらをCUSTIDとNUMで部分外部結合します。
image.png

フィルタータブで1トランザクション前のDATEは削除し、AMOUNTとNUMPRUCHASEには「_LAG」の接尾辞をつけました。

image.png

最後にCUSTIDとDATEでソートをしました。
image.png

@OFFSETで得られた結果と同じ結果が得られました。

image.png

これならSQLプッシュバックが可能です。

image.png

ここではDb2のデータベース関数のROWNUMBERをつかって実現していますが、もしこれに該当する関数が接続しているRDBにない場合は、いったん@INDEXなどで連番を振って一時表をRDBに作ってから行うということもできます(この処理だけならCUSTIDでパーティション化する必要はありません)。@INDEXもSQLプッシュバックが効きませんが、一時表以降はSQLプッシュバックが可能になります。

参考:OLAP 指定 - IBM Documentation

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0