* 제목 : key 값을 기준으로 다중 데이터 항목을 허용하는 hash 테이블에서 항목의 개수를 카운트하기.;
* Sample 34757: Count the number of items in a hash table, allow multiple data items per key;
* 출처 : http://support.sas.com/kb/34/757.html;
* 목적 : (SAS 9.2 이후 사용가능)
NUM_ITEMS 속성과 HAS_NEXT, FIND_NEXT 매소드를 사용하여서 HASH 오브젝트에 다수의 중복된 키 값을 포함 할 수 있는 방법을 설명한다.
DECLARED으로 HASH 테이블 선언 시 MULTIDATA 인수를 포함하여 선언되었다.
* 참고 : SAS 9.1 이전에서는 Key 값을 기준으로 다중 항목을 허용하지 않기 때문에, 항목의 값은 유일해야 한다.
=> Sample 24594: Count the number of items in a hash table;
data test;
input key1 key2 data1;
datalines;
1 1 11
1 1 22
1 2 12
1 2 122
;
/***************************************************************************/
/* HASH 오브젝트는 기본적으로 KEY 변수에 대하여 중복을 허용하지 않는다. */
/* WORK.TEST는 KEY1과 KEY2 변수를 기준으로 중복값이 존재한다. 이 경우 개별 */
/* 키 값(조합)의 첫번째 값이 HASH 테이블 H에 로딩된다. */
/***************************************************************************/
data nodups;
/* 데이서 스텝의 첫 번째 반복 작업에서 Hash 테이블 H를 생성하고 인스턴트화 한다.
DATASET: 인수 태그를 사용하여서 Hash 테이블 H에 WORK.TEST 데이터 세트를 로딩한다.
일치하는 값을 찾기 위하여 CAP 변수를 키(KEY) 변수로 정의한다.
또한, CPA 변수를 출력하기 위하여 데이터 항목으로 정의한다.
KEY1과 KEY2 변수를 키 변수로 정의하고, HASH 테이블에서 데이터 항목으로 DATA1을 저장한다.
로그에 "지정된 변수가 초기화되지 않았습니다." 메시지 출력을 방지하기 위하여,
데이터 세트 변수 KEY1,KEY2,DATA1 변수를 결측치 값으로 초기화한다. */
if _n_ = 1 then do;
dcl hash h(dataset:'work.test');
h.defineKey('key1', 'key2');
h.definedata('data1');
h.defineDone();
call missing(key1, key2, data1);
end;
/* 데이터 세트 변수 KEY1와 KEY2에 데이터 값 할당 */
key1=1;
key2=1;
/* FIND 매소드를 사용하여서 HASH 오프젝트 H에서 KEY1과 KEY2 변수의 값과 일치하는
값을 찾는다 */
rc=h.find();
/* NUM_ITEMS 속성을 사용하여서 HASH 오브젝트 H에 존재하는 항목의 개수를 반환하여서,
이 값을 데이터 세트 변수 TOTALITEMS에 할당한다. */
totalitems = h.num_items;
/* 로그에 DATA1과 TOTALITEMS 값을 출력한다. */
put data1=;
put totalitems=;
run;
/************************************************************************/
/* 다음 예제에서는 KYE1,KEY2 변수가 키 변수로 정의되었다. */
/* In this sample KEY1, KEY2 and DATA1 are defined as keys. */
/* multidata: 인수를 지정하여서 중복된 값의 로딩이 가능하다. */
/************************************************************************/
data dups ;
if _n_ = 1 then do;
dcl hash h(dataset:'work.test', multidata:'yes');
h.defineKey('key1', 'key2');
h.definedata('data1');
h.defineDone();
call missing(key1, key2, data1);
end;
/* 데이터 세트 변수 KEY1와 KEY2에 데이터 값 할당 */
key1=1;
key2=1;
/* FIND 매소드를 사용하여서 HASH 오프젝트 H에서 KEY1=1과 KEY2=1 변수의 값과 일치하는
값을 찾는다. 일치하는 값을 발견하면 zero(0)값을 반환한다. */
rc=h.find();
rc = h.has_next(result:R);
/* 키 값을 기준으로 중복값이 존재하면, 다음 키 값을 발견하기 전까지 중복값을 출력한다. */
do while (rc = 0);
put key1= key2= data1=;
rc = h.find_next();
end;
/* 로그에 DATA1의 값과 TOTALITEMS 값을 출력한다. */
put data1=;
totalitems = h.num_items;
put totalitems=;
run;
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.