You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL统计director与organizer的直接及间接汇报总人数

解决方案

你原来的写法只能统计单个节点的原因是递归锚点固定了单个eid,且没有记录每个下属归属的根节点(即对应的director/organizer)。修改逻辑如下:

  1. 递归锚点改为筛选所有角色为director或organizer的记录,同时新增字段记录根节点的eid和角色
  2. 递归遍历下属链路时,始终携带根节点信息
  3. 最终按根节点分组统计总人数即可

最终查询语句

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 04:27:04