运行 用 window 函数求和
running sum with window function
我在 table 中有以下数据:
col1
---
1
2
5
9
10
我想更新 table 中的 col2
为 运行 col1
与 col1
的先前值之差的总和减去 1
col2 = col2.prev + col1 - col1.prev - 1
结果将是:
col1 | col2
--------------
1 | 0
2 | 0
5 | 2
9 | 5
10 | 5
我尝试使用 window 函数:
SELECT sum(col1 - lag(col1) OVER (ORDER BY col1) - 1) AS col2 FROM table1
但这是不允许的 - 错误:聚合函数调用不能包含 window 函数调用
还有其他方法可以实现吗?我知道我可以很容易地编写一个函数来循环遍历行,但从我读到的内容中我得到的印象是这种方法在大多数情况下效率不高并且不受欢迎。印象有误请指正
ERROR: aggregate function calls cannot contain window function calls
显示此错误消息是因为不允许将聚合函数应用于通过窗口表达式生成的列。也不允许应用第二个窗口表达式。解决方案是简单地将结果包装在 cte 中并在随后的 select 语句中应用第二个窗口表达式。
WITH mytable(col1) AS (
VALUES (1), (2), (5), (9), (10)
)
, lagdiff AS (
SELECT
col1
, COALESCE(col1 - lag(col1) OVER (ORDER BY col1) - 1, 0) col2_
FROM mytable
)
SELECT
col1
, SUM(col2_) OVER (ORDER BY col1) col2
FROM lagdiff
产生输出:
col1 | col2
------+------
1 | 0
2 | 0
5 | 2
9 | 5
10 | 5
(5 rows)
我在 table 中有以下数据:
col1
---
1
2
5
9
10
我想更新 table 中的 col2
为 运行 col1
与 col1
的先前值之差的总和减去 1
col2 = col2.prev + col1 - col1.prev - 1
结果将是:
col1 | col2
--------------
1 | 0
2 | 0
5 | 2
9 | 5
10 | 5
我尝试使用 window 函数:
SELECT sum(col1 - lag(col1) OVER (ORDER BY col1) - 1) AS col2 FROM table1
但这是不允许的 - 错误:聚合函数调用不能包含 window 函数调用
还有其他方法可以实现吗?我知道我可以很容易地编写一个函数来循环遍历行,但从我读到的内容中我得到的印象是这种方法在大多数情况下效率不高并且不受欢迎。印象有误请指正
ERROR: aggregate function calls cannot contain window function calls
显示此错误消息是因为不允许将聚合函数应用于通过窗口表达式生成的列。也不允许应用第二个窗口表达式。解决方案是简单地将结果包装在 cte 中并在随后的 select 语句中应用第二个窗口表达式。
WITH mytable(col1) AS (
VALUES (1), (2), (5), (9), (10)
)
, lagdiff AS (
SELECT
col1
, COALESCE(col1 - lag(col1) OVER (ORDER BY col1) - 1, 0) col2_
FROM mytable
)
SELECT
col1
, SUM(col2_) OVER (ORDER BY col1) col2
FROM lagdiff
产生输出:
col1 | col2
------+------
1 | 0
2 | 0
5 | 2
9 | 5
10 | 5
(5 rows)