以前、以下の記事を書きました。
HASHオブジェクトで、Key変数毎に最小値・最大値・合計値などを取得する方法
で、マニュアルをよくよく見ると、SAS9.4から追加になった「DO_OVERメソッド」を使えばもっと楽に書けたんですね。勉強不足すぎ・・
というわけで、前書いた記事の訂正、というか追記です。
サンプルデータの作成部分とか諸々の説明などは前書いた記事を参照下さい。
以下が訂正したプログラム
かなりシンプルになりました!
「DO_OVERメソッド」は、「FINDメソッド」「FIND_NEXTメソッド」を組み合わせたようなやつです。
サンプルデータの作成部分とか諸々の説明などは前書いた記事を参照下さい。
以下が訂正したプログラム
data OUT;
set DT1;
/* 購入データをHashオブジェクトに格納 */
if _n_=1 then do;
length PURDATE 8.;
call missing( PURDATE );
dcl hash purhash( dataset:"DT2", multidata:"y" );
purhash.definekey("NO");
purhash.definedata("PURDATE");
purhash.definedone();
end;
/* Hashオブジェクト内をループして、顧客IDごとの購入日の最小値を取得 */
rc = purhash.reset_dup();
do while ( purhash.do_over()=0 );
if PURDATE^=. then MINDATE = min( MINDATE, PURDATE ); end;
format MINDATE yymmdd10.;
keep NO SEX AGE MINDATE;
run;
|
かなりシンプルになりました!
「DO_OVERメソッド」は、「FINDメソッド」「FIND_NEXTメソッド」を組み合わせたようなやつです。
例では「RESET_DUPメソッド」というものも使用していますが、実は今回の例では不要。
どういう時に使用するかは、以下に記載しています。
📝DO_OVERの注意点
今回の例のように、
do while ( purhash.do_over()=0 ); |
DO WHIILE & DO_OVERで、検索中のkey値がHashオブジェクト内になくなるまでループする必要があります。
もし、検索中のkey値がHashオブジェクト内にまだある状態で、途中からkey値を手動で変えてしまうと、DO_OVERの結果がバグります。
バグらないようにするには「RESET_DUPメソッド」を使って、Hashオブジェクト内の検索位置をリセットする必要があります。
詳細はマニュアルを参照下さい。
0 件のコメント:
コメントを投稿