首页 > 解决方案 > PostgreSQL 获取所有可能的起点/终点节点序列

问题描述

我有这个带有有向图节点的 PostgreSQL 表:

node_id | node_sequence 
-----------------------
   1           1
   2           2 
   3           3 

我将返回一个表,其中包含节点之间所有可能的原始目标序列(仅在一个方向上):(1,2);(1,2,3); (2,3)。所以输出表应该是:

node_id
 ----
   1
   2
   1
   2
   3
   2
   3

也许 WITH RECURSIVE 是正确的做法,但我不明白怎么做。

标签: postgresqlwindow-functionswith-statemento-d-matrix

解决方案


从最初的答案编辑
您似乎有两个您在问题中没有提到的约束:

  • 您需要至少 2 个元素的序列
  • 序列中的元素必须是升序且连续的

这是一个简单的查询(CTE GraphNode 应该替换为您的表):

WITH RECURSIVE GraphPath AS (
SELECT G2.Node, ARRAY[G1.Node, G2.Node] AS GraphPath /* Start with 2 elements */
FROM GraphNode G1
JOIN GraphNode G2 ON G1.Node + 1 = G2.Node
UNION ALL
SELECT N.Node, P.GraphPath || N.Node
FROM GraphNode N
JOIN GraphPath P ON N.Node = 1 + P.Node 
), GraphNode AS (
SELECT UNNEST(ARRAY[1,2,3]) AS Node
)
SELECT GraphPath
FROM GraphPath
ORDER BY GraphPath

推荐阅读