промежуточная сумма с оконной функцией - PullRequest
1 голос
/ 14 мая 2019

У меня есть следующие данные в таблице:

col1
---
1
2
5
9
10

Я хочу обновить col2 в таблице с текущей суммой разницы между col1 и предыдущим значением col1минус 1

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 Ответ

1 голос
/ 14 мая 2019

ОШИБКА: вызовы агрегатных функций не могут содержать вызовы оконных функций

Это сообщение об ошибке отображается, поскольку не разрешено применять статистическую функцию к столбцу, сгенерированному с помощью оконного выражения.Также не разрешено применять второе оконное выражение.Решение состоит в том, чтобы просто обернуть результат в 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)
...