2

我有以下数据集,其中每个员工都与经理职位相关联。现在需要使用经理职位找到员工的经理的员工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 函数尝试了问题的递归性质。

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

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; 

请帮我解决一下这个。

4

1 回答 1

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; 
于 2013-09-03T23:37:52.943 回答