尝试使用 SAS(据我所知,不支持WITH RECURSIVE)在 SQL 中创建经典的层次结构树。
这是现有表中的简化数据结构:
|USER_ID|SUPERVISOR_ID|
因此,要构建层次结构,您只需递归连接 x 次即可获取您要查找的数据,其中SUPERVISOR_ID = USER_ID
。在我公司,是16级。
当尝试让每个用户终止分支时会出现此问题。例如,假设级别 1 的用户 A 下有级别 2 的用户 B、C、D 和 E。因此,使用递归 LEFT JOIN,您将得到:
| -- Level 1 -- | -- Level 2 -- |
User A User B
User A User C
User A User D
User A User E
问题是,用户 A 没有自己的终止分支。需要的最终结果是:
| -- Level 1 -- | -- Level 2 -- |
User A NULL
User A User B
User A User C
User A User D
User A User E
我的第一个想法是我可以通过在每个级别创建一个临时表然后对结果一起执行 UNION ALL 来解决这个问题,但是考虑到大小(16 个级别),这似乎效率非常低,我希望我在这里遗漏了一些东西是一个更清洁的解决方案。
我不太确定我理解这个问题,但如果您试图生成每个主管下的所有员工的完整列表,那么这是一种方法,假设每个员工都有一个唯一的 ID,该 ID 可以出现在用户或主管列:
data employees;
input SUPERVISOR_ID USER_ID;
cards;
1 2
1 3
1 4
2 5
2 6
2 7
7 8
;
run;
proc sql;
create view distinct_employees as
select distinct SUPERVISOR_ID as USER_ID from employees
union
select distinct USER_ID from employees;
quit;
data hierarchy;
if 0 then set employees;
set distinct_employees;
if _n_ = 1 then do;
declare hash h(dataset:'employees');
rc = h.definekey('USER_ID');
rc = h.definedata('SUPERVISOR_ID');
rc = h.definedone();
end;
T_USER_ID = USER_ID;
do while(h.find() = 0);
USER_ID = T_USER_ID;
output;
USER_ID = SUPERVISOR_ID;
end;
drop rc T_USER_ID;
run;
proc sort data = hierarchy;
by SUPERVISOR_ID USER_ID;
run;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)