我在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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。