* 제목 : SAS 데이터 세트의 개별 관측치에 대한 다중 조회 작업 수행하기
* Sample 24704: Perform multiple lookups for each observation of a SAS data set
* 출처 : http://support.sas.com/kb/24/704.html;
* 목적 : HASH 오브젝트에 조회 테이블 로딩하고, 데이터 세트의 개별 관측치에 대하여 다중 FIND 매소드 작업 실행한다.;
/* HASH 테이블을 검색하기 위하여 이용되는 변수가 FIND 매소드의 개별 호출에 따라 변경됨을 유의하기 바랍니다. */
data lookup;
infile datalines truncover;
input emp_nbr emp_nm $20.;
datalines;
1000 John Ho
1001 Madhu Sundrie
1002 Jim Simpson
1003 Chris Hostess
2003 Rachel Holiday
2005 Mert Demitter
3004 Amit Gong
;
data group;
input emp_nbr1 mgr_id mandir_id Account $6. @23 contract_dt mmddyy10.;
format contract_dt mmddyy10.;
datalines;
1000 2003 3004 ABC Co 05/04/2002
1001 2005 3004 NBC 06/08/2001
1003 2003 3004 XYZ 01/02/2003
;
data final(keep=employee manager mandir account contract_dt);
length emp_nbr 8;
length emp_nm $ 20;
/* 데이터 스텝의 첫 번째 반복 작업에서 Hash 테이블 H를 생성하고 인스턴트화 한다.
DATASET: 인수 태그를 사용하여서 Hash 테이블 H에 WORK.LOOKUP 데이터 세트를 로딩한다.
HASHEXP 인수 태그는 데이터를 저장하기 위하여 이용되는 버켓(buckets)의 개수를 지정한다.
HASHEXP 인수의 값을 변경하여서 HASH 오브젝트에 대한 검색 속도를 튜닝 할 수 있는데,
가장 적합한 버켓을 크기를 결정하기 위하여 다양한 비교 테스트를 수행해야 한다.
HASH 테이블 검색을 위하여 EMP_NBR 변수를 키 변수로 정의하고,
KEY 변수와 연관된 데이터 변수로 EMP_NM 변수를 정의한다.
로그에 "지정된 변수가 초기화되지 않았습니다." 메시지 출력을 방지하기 위하여,
데이터 세트 변수 emp_nbr,emp_nm 변수를 결측치 값으로 초기화한다. */
if _N_ = 1 then do;
declare hash h(dataset: "work.lookup", hashexp: 6);
h.defineKey('emp_nbr');
h.defineData('emp_nm');
h.defineDone();
call missing(emp_nbr, emp_nm);
end;
set group;
array name(*) $ 20 employee manager mandir;
array id(*) emp_nbr1 mgr_id mandir_id;
/* NAME 배열의 모든 원소에 대하여, ID 배열에서 대응하는 값을 EMP_NBR 변수에 할당하여서 검색 작업을 수행한다.
/* FIND 매소드를 사용하여서 HASH 오브젝트 H에서 해당하는 값에 대한 검색 작업을 수행한다.
/* HASH 테이블에서 일치하는 값을 찾은 경우(RC=0),
데이터 항목 EMP_NM 변수의 데이터 값을 NAME 배열에서 현재 지정한 변수의 값으로 할당한다. */
do i=1 to dim(name);
emp_nbr=id(i);
rc=h.find();
if (rc=0) then name(i)=emp_nm;
end;
run;
proc print;
run;
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!