我有以下数据集,其中每个员工都与经理职位挂钩。 现在需要使用经理职位找到员工经理的员工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;
请帮助我。
答案 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;