带窗口功能的总和

时间:2019-05-14 06:02:52

标签: sql postgresql window-functions postgresql-9.6

我在表中有以下数据:

col1
---
1
2
5
9
10

我想用col2col1的先前值减去1的差值之和求和来更新表中的col1

col2 = col2.prev + col1 - col1.prev - 1

结果将是:

col1  |  col2
--------------
  1   |  0
  2   |  0
  5   |  2
  9   |  5
 10   |  5

我尝试使用窗口函数:

SELECT sum(col1 - lag(col1) OVER (ORDER BY col1) - 1) AS col2 FROM table1

但这是不允许的-错误:聚合函数调用不能包含窗口函数调用

还有另一种方法可以做到这一点吗?我知道我可以很容易地编写一个遍历行的函数,但是从我所读的内容中我得到的印象是,这种方法在大多数情况下效率不高,不建议使用。如果我有错误的印象,请纠正我。

1 个答案:

答案 0 :(得分:1)

  

错误:集合函数调用不能包含窗口函数调用

之所以显示此错误消息,是因为不允许在通过窗口表达式生成的列上应用聚合函数。也不允许应用第二个窗口表达式。解决方案是将结果简单地包装在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)