Запрос: SELECT dept, SUM(salary), RANK() OVER(ORDER BY SUM(salary) DESC) FROM employees GROUP BY dept. Когда сработает оконная функция RANK()?

AОконная функция применится к исходным строкам до группировки — окно видит все строки таблицы
BОконная функция вычисляется после GROUP BY и видит по одной строке на группу
CЗапрос завершится ошибкой — оконные функции несовместимы с GROUP BY в одном запросе
DОконная функция и GROUP BY выполнятся параллельно, и результаты будут объединены
Правильный ответ. Оконные функции вычисляются после GROUP BY и HAVINGRANK() видит уже сгруппированные строки, по одной на каждый отдел.

Разбор

Логический порядок выполнения SQL: FROMWHEREGROUP BYHAVING → оконные функции → SELECTORDER BY. Поэтому RANK() OVER(ORDER BY SUM(salary) DESC) получает на вход результат группировки — по одной строке на отдел с вычисленной суммой — и ранжирует эти агрегированные строки. Оконная функция не может «заглянуть» в исходные строки внутри группы.

Проверь себя · 1/3разбор после ответа
Что вернёт запрос SELECT AVG(salary) FROM employees;?
Тренировать SQL в Telegram

Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»