加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL以递归方式聚合节点

发布时间:2020-12-13 16:09:21 所属栏目:百科 来源:网络整理
导读:我在postgres中的表格如下所示.将数组中的这些值解释为在有向图中连接的节点的ID.我想得到的是可能的路径列表(匹配每行的最后一个ID与其他行的第一个ID) 数据: foo------- {1} {2,7} {3,4} {4,6} {5} {6,8} {7} {8} 预期结果: {1}{2,7}{3,4,6,8}{5} 我尝试
我在postgres中的表格如下所示.将数组中的这些值解释为在有向图中连接的节点的ID.我想得到的是可能的路径列表(匹配每行的最后一个ID与其他行的第一个ID)

数据:

foo
-------
 {1}
 {2,7}
 {3,4}
 {4,6}
 {5}
 {6,8}
 {7}
 {8}

预期结果:

{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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读