gpt4 book ai didi

PostgreSQL WITH RECURSIVE 查询通过分区键获取有序的父子链

转载 作者:行者123 更新时间:2023-11-29 11:34:49 25 4
gpt4 key购买 nike

我在 PostgreSQL 9.6.6 上编写 sql 脚本时遇到问题,该脚本通过使用步骤的父子 ID 对流程中的步骤进行排序,并且按流程 ID 分组/分区。我在这里找不到这种特殊情况,如果我错过了,我深表歉意,请您在评论中提供解决方案的链接。

案例:我有一张看起来像这样的表:

processID | stepID | parentID
1 1 NULL
1 3 5
1 2 4
1 4 3
1 5 1
2 1 NULL
2 3 5
2 2 4
2 4 3
2 5 1

现在我必须从每个 processID 的 parentID 为 NULL 的步骤开始对步骤进行排序。

注意:我不能简单地对 StepID 或 parentID 进行排序,因为我在整个过程中放置​​的新步骤获得的 stepID 高于过程中的最后一步(连续生成代理键)。

我必须为每个 processID 排序步骤,我将收到以下输出:

processID | stepID | parentID
1 1 NULL
1 5 1
1 3 5
1 4 3
1 2 4
2 1 NULL
2 5 1
2 3 5
2 4 3
2 2 4

我尝试使用 CTE 函数 WITH RECURSIVE 来做到这一点:

    WITH RECURSIVE
starting (processID,stepID, parentID) AS
(
SELECT b.processID,b.stepID, b.parentID
FROM process b
WHERE b.parentID ISNULL
),
descendants (processID,stepID, parentID) AS
(
SELECT b.processID,b.stepID, b.stepparentID
FROM starting b
UNION ALL
SELECT b.processID,b.stepID, b.parentID
FROM process b

JOIN descendants AS c ON b.parentID = c.stepID
)
SELECT * FROM descendants

结果不是我要找的。由于我们有数百个进程,我收到一个列表,其中第一条记录是不同的 processID,它们的 parentID 为 NULL 值。

我想我必须再次递归 processID 上的整个脚本,但不知道如何做。

感谢您的帮助!

最佳答案

你应该计算每一步的水平:

with recursive starting as (
select processid, stepid, parentid, 0 as level
from process
where parentid is null
union all
select p.processid, p.stepid, p.parentid, level+ 1
from starting s
join process p on s.stepid = p.parentid and s.processid = p.processid
)
select *
from starting
order by processid, level

processid | stepid | parentid | level
-----------+--------+----------+-------
1 | 1 | | 0
1 | 5 | 1 | 1
1 | 3 | 5 | 2
1 | 4 | 3 | 3
1 | 2 | 4 | 4
2 | 1 | | 0
2 | 5 | 1 | 1
2 | 3 | 5 | 2
2 | 4 | 3 | 3
2 | 2 | 4 | 4
(10 rows)

当然,如果你不需要,你可以跳过最终选择的最后一列。

关于PostgreSQL WITH RECURSIVE 查询通过分区键获取有序的父子链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52518210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com