PostgreSQL递归聚合节点
我在博士后的表格如下所示。将数组中的这些值解释为在有向图中连接的节点的ID。我想要得到的是可能路径的列表(将每行的最后一个ID与其他行的第一个ID相匹配) 数据: 预期结果:PostgreSQL递归聚合节点,sql,database,postgresql,nodes,Sql,Database,Postgresql,Nodes,我在博士后的表格如下所示。将数组中的这些值解释为在有向图中连接的节点的ID。我想要得到的是可能路径的列表(将每行的最后一个ID与其他行的第一个ID相匹配) 数据: 预期结果: {1} {2,7} {3,4,6,8} {5} 我尝试过使用递归查询和窗口函数,但没有达到我的预期效果。您是否希望看到这样的功能: WITH RECURSIVE x AS ( -- choose first level - without more connections SELECT
{1}
{2,7}
{3,4,6,8}
{5}
我尝试过使用递归查询和窗口函数,但没有达到我的预期效果。您是否希望看到这样的功能:
WITH RECURSIVE x AS (
-- choose first level - without more connections
SELECT id, id AS full_id, 1 AS level
FROM foo
WHERE NOT EXISTS (
SELECT 1
FROM foo AS foo2
WHERE foo.id != foo2.id
AND foo.id[1] = foo2.id[array_length(foo2.id, 1)])
-- add tail
UNION ALL
SELECT x.id, x.full_id || foo.id[2:array_length(foo.id, 1)], level + 1
FROM x
JOIN foo ON (
foo.id != x.id
AND foo.id[1] = x.full_id[array_length(x.full_id, 1)]
AND array_length(foo.id, 1) != 1)
), z AS (
-- looks for maximum length
SELECT max(level) OVER (PARTITION BY id), * FROM x
)
-- choose only with maximum length
SELECT full_id FROM z WHERE max = level
所以它们只有在流动行中满足对的最后一个int时才会连接?是的,确切地说,我们将每行的最后一个int与其他行的第一个int匹配
WITH RECURSIVE x AS (
-- choose first level - without more connections
SELECT id, id AS full_id, 1 AS level
FROM foo
WHERE NOT EXISTS (
SELECT 1
FROM foo AS foo2
WHERE foo.id != foo2.id
AND foo.id[1] = foo2.id[array_length(foo2.id, 1)])
-- add tail
UNION ALL
SELECT x.id, x.full_id || foo.id[2:array_length(foo.id, 1)], level + 1
FROM x
JOIN foo ON (
foo.id != x.id
AND foo.id[1] = x.full_id[array_length(x.full_id, 1)]
AND array_length(foo.id, 1) != 1)
), z AS (
-- looks for maximum length
SELECT max(level) OVER (PARTITION BY id), * FROM x
)
-- choose only with maximum length
SELECT full_id FROM z WHERE max = level