またハッシュオブジェクトの話です。
今回も、実際に僕がどういったシチュエーションでハッシュを使ったかの実践例の紹介です。
さて、関係性データベースの正規化とは、乱暴解釈すると、各テーブルがユニークなキーで管理できる状態になるまで、細切れにすることだと言えます(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 件のコメント:
コメントを投稿