Postgresql 给定表示路径的行,并指定一个总列
假设我有一个类似下表的表,它表示从1->2->3->4->5的路径:Postgresql 给定表示路径的行,并指定一个总列,postgresql,union,aggregate-functions,Postgresql,Union,Aggregate Functions,假设我有一个类似下表的表,它表示从1->2->3->4->5的路径: +------+----+--------+ | from | to | weight | +------+----+--------+ | a | b | 1 | | b | c | 2 | | c | d | 1 | | d | e | 1 | | e | f | 3 | +------+----+--------+ 每一行都知道
+------+----+--------+
| from | to | weight |
+------+----+--------+
| a | b | 1 |
| b | c | 2 |
| c | d | 1 |
| d | e | 1 |
| e | f | 3 |
+------+----+--------+
每一行都知道它从哪里来,要去哪里
我希望合并一个总行,该行采用起始名称、结束名称和总权重,如下所示:
+------+----+--------+
| from | to | weight |
+------+----+--------+
| a | f | 8 |
+------+----+--------+
第一个表是CTE表达式的结果,我可以通过SUM
轻松获得上一次查询的总数,但我无法获得最后一个\u值
以与以下类似的方式工作:
WITH RECURSIVE cte AS (
...
)
SELECT *
FROM cte
UNION ALL
SELECT 'total', FIRST_VALUE(from), LAST_VALUE(to), SUM(weight)
FROM cte
FIRST\u VALUE
和LAST\u VALUE
函数需要OVER
子句,这似乎给我的期望增加了不必要的复杂性,因此我认为我走错了方向。关于如何实现这一点有什么想法吗?因此我提出了一个奇怪的解决方案:
to
值(再次按TRUE
分区)1
它是黑的吗?对它有用吗?也是。我确信有更好的解决方案,我很乐意听到。选择“总计”,最小(到),最大(从)作为起始,总和(重量)作为表中的重量。?@Krishna实际上,我应该编辑这个问题以更符合实际使用。
to
和from
不是数字,它们是字符串。我现在还不清楚to
如何在更新的示例输出中获取f
和from
获取a
。如果名称的顺序总是像1->2->3->4->5
那样,请尝试选择“总计”,然后按名称排序,LAST_VALUE(from)over(order by name),SUM(weight)from cte
我要采取的一种方法是有一列(比如,n)随着新路径的增加而不断增加(从n=1开始,在递归函数中执行n+1)。然后,我们可以将first\u value/last\u value
函数与order by n
一起使用。
WITH RECURSIVE cte AS (
...
)
SELECT *
FROM cte
UNION ALL (
SELECT FIRST_VALUE(from) OVER (PARTITION BY TRUE), LAST_VALUE(to) OVER (PARTITION BY TRUE), total
FROM cte
CROSS JOIN (
SELECT SUM(weight) as total
FROM cte
) tmp
LIMIT 1
);