Postgresql列行匹配

时间:2017-07-13 07:44:44

标签: sql postgresql

我有一个表阶段有2列,记录就是这样

- C1 C2

  • 1 2
  • 2 3
  • 5 6
  • 6 7
  • 8 9

我需要的输出是:

  • 1,2,3
  • 5,6,7
  • 8,9

在第1行和第2行以及第2行和第3行,但输出I需要1,2,3。 如何解决这类问题,请提供查询和建议。

1 个答案:

答案 0 :(得分:1)

使用递归CTE处理SQL中的树结构。

我正在使用名为path的CTE来计算各种链接项。 联盟的第一部分查找所有路径开始(c1值不存在的项目作为另一行的v2值)。

第二部分遵循结束的路径。它不断添加路径文本字段的每个连接。

with recursive paths as
(
    -- find start points (store start in root)
    select c1 as root, c2, c1 || ',' || c2 as path, 1 as len 
    from stage where not exists (select * from stage t2 where t2.c2 = stage.c1)
union all
    -- add the next item to the path
    select paths.root, stage.c2, paths.path || ',' || stage.c2, len+1 from paths
    inner join stage on paths.c2 = stage.c1
)
select path from paths
where 
  -- only choose longest path from each start point
  not exists (select * from paths x where x.len > paths.len and x.root = paths.root)
order by path

最后,我找到了每个起始点(根)找到的最长路径。

CTE记录在https://www.postgresql.org/docs/9.6/static/queries-with.html