引用输入数据集本身 - 使用POINT选项递归 - SAS

时间:2013-09-03 17:08:50

标签: sas

我有以下数据集,其中每个员工都与经理职位挂钩。 现在需要使用经理职位找到员工经理的员工ID。 如果在直接经理的位置,没有一个是ACTIVE,那么我们需要找到经理的经理职位,并发现任何ACTIVE员工都与该职位挂钩。这需要继续,直到找到ACTIVE管理器。

ID -> Employee ID    
PSTN -> Employee Position code    
MPSTN-> Manager Position code    
STAT -> Employee Status (T - Term A - Active)    

输入数据集:

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函数尝试了问题的RECURSIVE性质。

它的工作正常,除了递归部分 - 其中搜索下一级活动管理器。

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; 

请帮助我。

1 个答案:

答案 0 :(得分: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;