Отличается от агрегационных и аналитических функций - PullRequest
1 голос
/ 17 марта 2020

Мне просто любопытно, есть ли способ сделать это в Postgres?

SUM(DISTINCT column_a) OVER(PARTITION BY column_b, column_c)

Использование DISTINCT вызывает ошибку: DISTINCT не реализован для оконных функций

1 Ответ

0 голосов
/ 18 марта 2020

Это должно сработать:

SELECT column_a,
       column_b,
       column_c,
       sum(column_a) FILTER (WHERE is_new) OVER w
FROM (SELECT column_a,
             column_b,
             column_c,
             column_a IS DISTINCT FROM lag(column_a) OVER w AS is_new
      FROM atable
      WINDOW w AS (PARTITION BY column_b, column_c ORDER BY column_a)
     ) AS q
WINDOW w AS (PARTITION BY column_b, column_c ORDER BY column_a);

Во внутреннем запросе все дубликаты column_a получат is_new = FALSE, поэтому эти дубликаты не учитываются во внешнем запросе.

...