Условие

Выберите верные утверждения об оконных функциях вида F(...) OVER(...):
- A) Агрегирующая оконная функция сокращает количество строк в результате запроса.
- B) В скобках после
OVERможет быть пусто. - C) Можно использовать агрегатные функции внутри оконных функций.
- D) Оконная функция не может участвовать в условии в
WHERE.
Задание засчитывается, если все варианты выбраны правильно.
Решение
Верны: B, C, D.
- A — неверно. Оконная функция отличается от обычной агрегации именно тем, что не схлопывает строки.
SUM(x) OVER (...)оставляет столько же строк, сколько было в источнике. - B — верно.
OVER ()безPARTITION BYиORDER BYозначает «окно — все строки результата». Например:SUM(amount) OVER ()— общая сумма, повторённая в каждой строке. - C — верно. Внутри
F(...)оконной функции можно поместить агрегат (SUM,AVG,COUNTи т.д.). Тогда сначала выполнится агрегация (если естьGROUP BY), а потом окно поверх агрегированного результата. БезGROUP BYэто просто оконная агрегация. - D — верно. Оконные функции вычисляются после
WHERE(на этапеSELECT). Поэтому вWHEREони недоступны — нужно обернуть запрос в подзапрос/CTE и фильтровать на внешнем уровне.
Порядок выполнения
FROM → WHERE → GROUP BY → HAVING → SELECT (включая оконные) → ORDER BY → LIMIT
Поэтому, например, WHERE ROW_NUMBER() OVER (...) = 1 не сработает.
Подводные камни
- Считать, что
SUM(x) OVER ()=SUM(x)послеGROUP BY. БезGROUP BYоконная функция повторит общую сумму в каждой строке, а обычный агрегат вернёт одну строку. - Использовать оконку в
WHERE. Только в подзапросе или через CTE:SELECT * FROM (SELECT x, ROW_NUMBER() OVER (ORDER BY ts) rn FROM t) WHERE rn = 1. - Забывать про
ORDER BYв окне. ДляSUM(x) OVER (ORDER BY ts)это бегущий итог; безORDER BY— общая сумма.
Эталонный ответ
B, C, D.