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

递归汇总河流长度:多父河流分组汇总问题求助

解决多父河流递归分组汇总问题

嘿,我明白你现在的困扰——已经能搞定单条父河流的子长度汇总,但想同时对多个父河流分组计算时,加了OR就乱套了对吧?这其实是因为递归过程中没给每个河流明确标记所属的顶级父河流(根节点),导致不同父河流的递归路径混在一起,分组自然失效。

下面给你一个清晰的解决方案,用递归CTE先梳理层级关系,再分组汇总:

步骤1:用递归CTE标记每个河流的根节点

首先通过递归CTE遍历整个河流层级,给每个河流绑定它所属的顶级父河流(也就是最上层的那条父河):

WITH RECURSIVE RiverHierarchy AS (
    -- 锚点:找出所有顶级父河流(根节点)
    SELECT 
        name AS river_name,
        river AS parent_river,
        length,
        name AS root_river  -- 顶级河流的根就是它自己
    FROM river
    WHERE river IS NULL OR river = name  -- 这里根据你的表结构调整,比如顶级河流的river字段为空/等于自身
    UNION ALL
    -- 递归:关联子河流,继承根节点标识
    SELECT 
        r.name AS river_name,
        r.river AS parent_river,
        r.length,
        rh.root_river
    FROM river r
    JOIN RiverHierarchy rh ON r.river = rh.river_name
)

步骤2:按根节点分组汇总总长度

有了带根节点标记的层级数据后,直接按根节点分组求和就行:

SELECT 
    root_river AS target_parent_river,
    SUM(length) AS total_child_and_self_length
FROM RiverHierarchy
GROUP BY root_river
ORDER BY total_child_and_self_length DESC;

为什么之前的OR方案不行?

你之前尝试加OR来同时指定多个父河流,相当于把不同父河流的递归起始点混在了一起,递归过程中没办法区分哪些子河流属于哪个父河,最终分组时自然无法正确归类。而上面的方法通过给每个河流绑定根节点,让所有属于同一父河体系的河流都带有相同的根标识,分组逻辑就清晰了。

小提示

如果你的表中顶级父河流的判断条件不是river IS NULL或river = name,记得调整锚点成员里的WHERE子句,比如有的表会用特定值(比如'NONE')标记顶级河流,对应修改即可。

内容的提问来源于stack exchange,提问作者tomoswizzard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:29:21