HASH的正常使用是要求惟一的key,但若是想使用相同關鍵值key,參考
https://wenku.baidu.com/view/2cc9b821a1c7aa00b42acba0.htmlhtml
舉例以下(應用:多對多的表關聯):spa
data testdup(index=(key));
length key data 8;
input key data;
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 a;
input key data1;
cards;
1 8
1 11
2 14
2 3
5 6
5 8
;
run;htm
data RESULT(KEEP=KEY DATA temp RESULT );
length r 8;
IF _N_=0 THEN SET A;
IF _N_=1 THEN DO;
dcl hash h(dataset:'A', multidata: 'y', ordered: 'y');/*multidata:'y'容許重複的KEY在hash中出現,默認狀況不容許*/
h.definekey('key');
h.definedata('key', 'data1');
h.definedone();
call missing (key, data1);
END;
SET testdup;
by key;
result=0;ci
rc = h.find();
if (rc = 0) then do;
if data>data1 then DO;result=1;TEMP=DATA1;ouput;END;
put key= data= data1= result=;
h.has_next(result: r);/*h.has_next():在容許出現相同關鍵詞的前提下,判斷是否存在下一條相同關鍵字的觀測*/
do while(r ne 0);/*不等於0表示存在下一條相同關鍵字的觀測*/
rc = h.find_next();/*h.find_next():在容許出現相同關鍵字的前提下,尋找下一條相同關鍵字的觀測*/
if data>data1 then DO;result=1;TEMP=DATA1; output;END;
put 'dup ' key= data= data1= result=;
rc = h.replacedup();/*h.replacedup():在容許出現相同關鍵詞的前提下,使用新的數據代替當前關鍵字對應的數據等*/
h.has_next(result: r);
end;
end; input
run;
PROC PRINT DATA=RESULT;
RUN;hash
結果以下:table
Obs | key | data | result | TEMP |
---|---|---|---|---|
1 | 1 | 10 | 1 | 8 |
2 | 1 | 15 | 1 | 8 |
3 | 1 | 15 | 1 | 11 |
4 | 2 | 11 | 1 | 3 |
5 | 2 | 16 | 1 | 14 |
6 | 2 | 16 | 1 | 3 |
7 | 2 | 9 | 1 | 3 |
8 | 5 | 99 | 1 | 6 |
9 | 5 | 99 | 1 | 8 |