2013-09-03 1 views
2

각 직원이 관리자 위치에 묶여있는 아래 데이터 세트가 있습니다. 이제 직원의 관리자의 직원 ID를 관리자 위치를 사용하여 찾아야합니다. 즉각적인 관리자의 위치에 ACTIVE가 없으면 관리자의 관리자 위치를 찾고 ACTIVE 직원이 해당 위치에 묶여 있어야합니다. ACTIVE 관리자가 발견 될 때까지 계속해야합니다.입력 데이터 세트 자체 참조 - POINT 옵션을 사용한 재귀 - SAS

입력 데이터 집합 :

data input; 
input id pstn mpstn stat$; 
datalines; 
1 10 30 A 
2 20 30 T 
3 30 40 T 
6 30 40 T 
4 40 50 A 
7 40 50 T 
5 50 50 A 
; 
run; 

출력 데이터 집합이 예상 :

ID MGR_ID 
1 4 
2 4 
3 4 
6 4 
4 5 
7 5 
5 5 

나는 POINT 기능 문제의 재귀 특성을 시도했다.

다음 단계 활성 관리자를 찾는 재귀 부분을 제외하고는 정상적으로 작동합니다.

data output ; 
    set input; 
    flag = 1; 
    do I = 1 to last while (flag=1); 
    set input(rename=(pstn=pstn1 stat=stat1 mpstn=mpstn1 id=id1)) nobs=last 
                    point=I; 
    if mpstn = pstn1 and stat1 = 'A' then 
    do; 
     MGRID = id1; 
     I=1; 
     flag=0; 
    end; 
    else flag=1; 
    end; 
run; 

제발 도와주세요.

답변

2

해시 맵을 사용하여 입력 데이터 집합을 반복하여 값을 찾을 수 있습니다. 재귀 적으로 조회를 호출하는 대신 루프를 do while() 루프에 넣는 것이 좋습니다.

data input; 

input id pstn mpstn stat$; 
format stat $1.; 
datalines; 
1 10 30 A 
2 20 30 T 
3 30 40 T 
6 30 40 T 
4 40 50 A 
7 40 50 T 
5 50 50 A 
; 
run; 

data out(keep=id mgr_id); 
set input; 
format pstn1 id1 mpstn1 best. 
     stat1 $1.; 
if _n_ = 1 then do; 
    declare hash mgr(dataset:"input(rename=(pstn=pstn1 stat=stat1 mpstn=mpstn1 id=MGR_ID))"); 
    rc = mgr.definekey("pstn1"); 
    rc = mgr.definedata("MGR_ID"); 
    rc = mgr.definedata("mpstn1"); 
    rc = mgr.definedata("stat1"); 
    rc = mgr.definedone(); 
end; 

found = 0; 
do while(^found); 
    pstn1 = mpstn; 
    rc = mgr.find(); 
    if stat1 = "A" then do; 
     /*MGR Found*/ 
     found = 1; 
    end; 
    else if rc then do; 
     /*RC^=0 when lookup fails*/ 
     MGR_ID = .; 
     found = 1; 
    end; 
    else do; 
     mpstn = mpstn1; 
    end; 
end; 
run; 
+0

동의하면 해시 테이블이 확실히 SAS에서이 작업을 수행하는 가장 쉬운 방법입니다. –

관련 문제