Выбор ответа 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 () сумма этих выручек по всем дням.
Варианты ответа
- Ошибка: нельзя вкладывать агрегат в оконную функцию
- Допустим: окно после GROUP BY, доля выручки дня в общейправильный ответ
- Ошибка: оконные функции нельзя сочетать с GROUP BY
- Допустим, но SUM(SUM(amount)) равен SUM(amount) в каждой строке
Разбор
Оконные функции вычисляются после группировки, поэтому могут работать над агрегатами: внутренний SUM(amount) это выручка дня, внешний SUM(...) OVER () сумма этих выручек по всем дням. Такой запрос легален в PostgreSQL. Последний вариант неверен: во внешнем окне суммируются уже все дни, а не один.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Топ-2 по зарплате в каждом отделе
Следующий вопрос
Нарастающий итог при одинаковых датах
Термины по теме
Ещё по теме «Оконные функции»
- Через сколько дней второй заказ
- Какие дубли удалить, оставив свежую запись
- Самый высоко- и низкооплачиваемый в отделе
- Самая длинная серия дней подряд
- Рост выручки к прошлому месяцу
- Скользящее среднее выручки за 3 дня
- Длинные перерывы между оплатами
- Разбиение кликов на сессии