【问题标题】:PostgreSQL get all possible origin/destination node sequencePostgreSQL 获取所有可能的起点/终点节点序列
【发布时间】:2019-04-19 17:29:56
【问题描述】:

我有这个带有有向图节点的 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 是正确的做法,但我不明白怎么做。

【问题讨论】:

  • 您将什么定义为a 的“组合”?
  • 我编辑问题。我会得到所有可能的值组合
  • 为什么 {1,3}?为什么不是单例 {1}、{2}、{3}?
  • 这是一个节点图表。我需要所有可能的链接,并且在我的系统中无法从 1 跳转到 3。对不起,也许我的回答不清楚。我只是用我需要的一对组合编辑它

标签: postgresql window-functions with-statement o-d-matrix


【解决方案1】:

从最初的答案编辑
您的问题中似乎有 2 个限制:

  • 您需要至少包含 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

【讨论】:

  • 它不起作用。我不想要“{1,3}”组合
  • 您能否详细说明应排除 {1,3} 的原因?对我来说,这是一个有效的(至少因为你说“所有可能的组合”。是因为 1 和 3 不连续吗?
  • 这是一个节点图表。我需要所有可能的链接,并且在我的系统中无法从 1 跳转到 3。对不起,也许我的回答不清楚。我只是用我需要的一对组合编辑它
  • 除非您可以提供另一个存储图形边缘的表,否则我无能为力。仅在您的大脑中的事物没有操作符。
  • 谢谢它的工作。但这不是通用查询,因为图边是特定于该示例的。我也有 100 个节点的序列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多