postgresql - 给定代表路径的行,合并总列
问题描述
假设我有一个类似于下表的表格,它表示从 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 | f | 8 |
+------+----+--------+
第一个表是 CTE 表达式的结果,我可以使用 轻松获得上一个查询的总数SUM
,但我无法以LAST_VALUE
类似于以下方式工作:
WITH RECURSIVE cte AS (
...
)
SELECT *
FROM cte
UNION ALL
SELECT 'total', FIRST_VALUE(from), LAST_VALUE(to), SUM(weight)
FROM cte
FIRST_VALUE
andLAST_VALUE
函数需要子句,这OVER
似乎给我的期望增加了不必要的复杂性,所以我认为我的方向是错误的。关于如何实现这一目标的任何想法?
解决方案
所以我做了一个奇怪的解决方案:
- 选择第一个
from
值(由 分区TRUE
) - 选择最后一个
to
值(TRUE
再次分区) - 交叉加入所有权重的总和,限制为
1
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
);
是哈克吗?是的。它有效吗?也是的。我确信有更好的解决方案,我很想听听。
推荐阅读
- android - 如何使用 Python 将联系人添加到 Android 手机
- python - UnboundLocalError:分配前引用的局部变量“enemyhp”
- javascript - 在 QML 中访问动态创建的对象属性
- java - Java 在初始化时将 var 添加到 Object
- php - Laravel 5.5:我是否在正确的模式下使用依赖注入?
- ansible - 如何使用 Ansible 遍历字典?
- android - 如何解决动态文本视图位置问题?
- typescript - 显示没有省略号的 Typescript 详细类型
- swift - 使用 override func draw(_ rect: CGRect) 时显示奇怪的边框
- kubernetes - 我可以独立安装单目 helm 吗?