Postgresql 给定表示路径的行,并指定一个总列

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 | +------+----+--------+ 每一行都知道

假设我有一个类似下表的表,它表示从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
轻松获得上一次查询的总数,但我无法获得
最后一个\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
子句,这似乎给我的期望增加了不必要的复杂性,因此我认为我走错了方向。关于如何实现这一点有什么想法吗?

因此我提出了一个奇怪的解决方案:

  • 从值中选择第一个(按TRUE划分)
  • 选择最后一个
    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
    );