运行 用 window 函数求和

running sum with window function

我在 table 中有以下数据:

col1
---
1
2
5
9
10

我想更新 table 中的 col2 为 运行 col1col1 的先前值之差的总和减去 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)