DO_OVERメソッド

DO_OVERメソッド

 重複キー内のデータを検索する際に使用します。

ハッシュオブジェクトではBYグループ集計ができないため、DO_OVERメソッドを使用することで同等の処理を実現することが可能です。

 

サンプル1:

data dup;
length key data 8;
input key data;
datalines;
1 10
1 15
2 16
2 9
3 10
3 101
3 102
;
run;

data _null_;
length r 8;
call missing (r,data,key);
dcl hash h(dataset:'dup', multidata: 'y', ordered: 'y');
h.definekey('key');
h.definedata('key', 'data');
h.definedone();

h.reset_dup();
do while(h.do_over(key:2) eq 0);
put key= data=;
end;

run;

 

 ただし、ソートされていない連続するキーでキーが頻繁に入れ替わる状況ではDO_OVERメソッドはキーの入れ替えを行ないません。このような場合はRESETDUPメソッドを使用します。

 

サンプル 

data dup;
input key_id value;
datalines;
1 10
2 11
1 15
3 20
2 16
2 9
3 100
5 5
1 5
4 6
5 99
;
run;

data dup_test;
dcl hash h(dataset:'dup', multidata: 'y', ordered: 'y');
h.definekey('key_id');
h.definedata('key_id', 'value');
h.definedone();

*1
dcl hash hunq(dataset:'dup', ordered: 'y');
hunq.definekey('key_id');  
hunq.definedata('key_id');
hunq.definedone();

call missing(key_id, value);
declare hiter hi("h");
declare hiter hunqi("hunq");

rc=hunqi.first();
/* summation by group */
do while(rc=0);
h.reset_dup();
_value=0;
do while(h.do_over(key:key_id) eq 0);
_value+value;
output;
end;
rc=hunqi.next();
end;
run;

 

上記のサンプルではあらかじめ重複キーのデータを一意のデータに加工してdo_overで集計しています。個人的にはこの使用方法がベストだと考えています。

 

*1:ハッシュイテレータでループしてDO_OVER、RESET_DUPが使用できるように一意キーの設定をします