Выбор ответа Senior Оконные функции обновлено

Окно поверх агрегата

Вопрос

Допустим ли запрос и что он считает?

SELECT day,
       SUM(amount) AS revenue,
       SUM(amount) * 100.0 / SUM(SUM(amount)) OVER () AS pct
FROM sales
GROUP BY day;

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Допустим: окно после GROUP BY, доля выручки дня в общей. Оконные функции вычисляются после группировки, поэтому могут работать над агрегатами: внутренний SUM(amount) это выручка дня, внешний SUM(...) OVER () сумма этих выручек по всем дням.

Варианты ответа

  1. Ошибка: нельзя вкладывать агрегат в оконную функцию
  2. Допустим: окно после GROUP BY, доля выручки дня в общейправильный ответ
  3. Ошибка: оконные функции нельзя сочетать с GROUP BY
  4. Допустим, но SUM(SUM(amount)) равен SUM(amount) в каждой строке

Разбор

Оконные функции вычисляются после группировки, поэтому могут работать над агрегатами: внутренний SUM(amount) это выручка дня, внешний SUM(...) OVER () сумма этих выручек по всем дням. Такой запрос легален в PostgreSQL. Последний вариант неверен: во внешнем окне суммируются уже все дни, а не один.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме