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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |