PostgreSQL统计director与organizer的直接及间接汇报总人数
解决方案
你原来的写法只能统计单个节点的原因是递归锚点固定了单个eid,且没有记录每个下属归属的根节点(即对应的director/organizer)。修改逻辑如下:
- 递归锚点改为筛选所有角色为
director或organizer的记录,同时新增字段记录根节点的eid和角色 - 递归遍历下属链路时,始终携带根节点信息
- 最终按根节点分组统计总人数即可
最终查询语句
WITH RECURSIVE ctename AS ( -- 锚点:所有需要统计的根节点(director/organizer) SELECT eid AS root_eid, role AS root_role, eid, role FROM reports r WHERE role IN ('director', 'organizer') UNION ALL -- 递归遍历所有直接/间接下属 SELECT ctename.root_eid, ctename.root_role, r.eid, r.role FROM reports r JOIN ctename ON r.peid = ctename.eid ) -- 按根节点分组统计总人数 SELECT root_eid AS eid, root_role AS role, COUNT(eid) AS reports -- 如果不需要统计根节点自身,改为COUNT(eid)-1即可 FROM ctename GROUP BY root_eid, root_role ORDER BY root_role, root_eid;
逻辑说明
- 锚点部分会一次性取出所有要统计的director和organizer作为根节点,每个根节点独立遍历自己的下属链路,不会互相干扰
- 递归部分保持原有逻辑,只是每次递归都保留根节点的信息,方便后续分组
- 你的示例里1234的统计结果1526是包含根节点自身的数值,直接用上述语句即可匹配预期。如果你的需求是只算下属的汇报人数(排除director/organizer自己),把
COUNT(eid)改成COUNT(eid)-1即可。
内容的提问来源于stack exchange,提问作者Zak
相关产品推荐
相关产品推荐

