首页 > 解决方案 > 给定代表路径的行,合并总列

问题描述

假设我有一个类似于下表的表格,它表示从 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_VALUEandLAST_VALUE函数需要子句,这OVER似乎给我的期望增加了不必要的复杂性,所以我认为我的方向是错误的。关于如何实现这一目标的任何想法?

标签: postgresqlunionaggregate-functions

解决方案


所以我做了一个奇怪的解决方案:

  1. 选择第一个from值(由 分区TRUE
  2. 选择最后一个to值(TRUE再次分区)
  3. 交叉加入所有权重的总和,限制为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
);

是哈克吗?是的。它有效吗?也是的。我确信有更好的解决方案,我很想听听。


推荐阅读