Запрос: 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 и HAVING — RANK() видит уже сгруппированные строки, по одной на каждый отдел.Разбор
Логический порядок выполнения SQL: FROM → WHERE → GROUP BY → HAVING → оконные функции → SELECT → ORDER BY. Поэтому RANK() OVER(ORDER BY SUM(salary) DESC) получает на вход результат группировки — по одной строке на отдел с вычисленной суммой — и ранжирует эти агрегированные строки. Оконная функция не может «заглянуть» в исходные строки внутри группы.
Проверь себя · 1/3разбор после ответа
Что вернёт запрос
SELECT AVG(salary) FROM employees;?Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»
- Что делает оператор `DISTINCT`?
- Что делает `HAVING`?
- Есть таблица `orders(user_id, amount)`. Какой запрос посчитает сумму всех заказов по каждому пользователю?
- Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице `orders` есть поля `user_id`, `amount`, `status`. Какой запрос корректен и наиболее эффективен?
- В таблице `users` есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
- Все вопросы по «Агрегация, GROUP BY и HAVING» →