中間テーブルを挟んだマージをハッシュオブジェクトを使って一撃で片づける話

またハッシュオブジェクトの話です。
今回も、実際に僕がどういったシチュエーションでハッシュを使ったかの実践例の紹介です。

さて、関係性データベースの正規化とは、乱暴解釈すると、各テーブルがユニークなキーで管理できる状態になるまで、細切れにすることだと言えます(DB論は詳しくないですが)

例えばデータセットA B Cがあって、AにCの情報をくっつけたいのに、AとCには共通のマージキーが存在せず、まずAとBとマージしてから、取得したBの情報でCとマージする必要があることって、普段結構あるはずです。

具体的には

data Q1;
A=1;B='A';output;
A=2;B='B';output;
A=3;B='A';output;
A=4;B='C';output;
run;








data Q2;
B='A';C='は';output;
B='B';C='い';output;
B='C';C='ろ';output;
run;







data Q3;
C='い';D='α';output;
C='ろ';D='β';output;
C='は';D='θ';output;
run;







という3つのデータセットがあって、

作りたい結果は








のように、最初のデータセットQ1のAという変数と最後のデータセットQ3のDの変数だけ
だとします。

しかし一直線にQ1とQ3を結合することができず、まずQ1のBとQ2のBでマージして
次にCとQ3のCを結合しなければ、Aに対応するDを取得できません。

順番にマージすればいいわけですが、いちいちキーでソートし直して、マージするのって
とても面倒です。


そこで、ハッシュオブジェクトの出番です。

data A1;
 if _N_=0 then do;
  set Q1;
  set Q2;
  set Q3;
 end;
 if _N_=1 then do;
  declare hash hQ2(dataset:'Q2');
   rc=hQ2.definekey('B');
   rc=hQ2.definedata('C');
   rc=hQ2.definedone();
  declare hash hQ3(dataset:'Q3');
   rc=hQ3.definekey('C');
   rc=hQ3.definedata('D');
   rc=hQ3.definedone();
  end;
   set Q1;
   rc=hQ2.find();
   rc2=hQ3.find();
   if rc+rc2^=0 then D='';
 keep A D;
run;

これで終わりです。

特筆すべきは、これはあくまで1回のデータステップで終了していること。キーによるソートも
必要としていないことです。

このようにデータセットの結合において、かなりいい仕事をしてくれます。
今回は単純な結合ですが、ここに色々条件をつけたり、途中データステップで合成した
値を使ってさらにべつのデータセットと結合したりとか、かなり特殊なこともできます。

柔軟性、応用可能性、自由度がほんと半端ないです。

僕も初心者でもっと勉強したいので、日本でハッシュオブジェクトが盛んになって
いっぱい色んな人の応用例が見たいです。

ちなみにユーザー総会での発表時間が変わって
ハッシュの発表はDay1の15:10-15:40になりました。
数独の発表はDay2の15:20 - 16:10になりました。
発表が2日間に分かれたのでよかったです。

ハッシュの方、ルームCは僕の発表が最後なので、ちょっと?ぐらい時間が足でても、次の発表者に迷惑掛かったりしないので、まあ大丈夫かなと悪いこと思ったりしてます。
また、質問とかあったら終了後いくらでもお答えできそうな気がします。






0 件のコメント:

コメントを投稿