递归汇总河流长度:多父河流分组汇总问题求助
解决多父河流递归分组汇总问题
嘿,我明白你现在的困扰——已经能搞定单条父河流的子长度汇总,但想同时对多个父河流分组计算时,加了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
相关产品推荐
相关产品推荐

