Запрос: 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разбор после ответа
Есть таблица
payments(amount), в части строк amount равно NULL. Какой запрос посчитает количество всех строк в таблице, включая строки с NULL в столбце amount?Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»
- Что делает оператор `DISTINCT` в `SELECT`-запросе?
- Что делает оператор `HAVING` в SQL-запросе с группировкой?
- Есть таблица `orders(user_id, amount)`. Какой запрос посчитает сумму всех заказов по каждому пользователю?
- Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице `orders` есть поля `user_id`, `amount`, `status`. Какой запрос корректен и наиболее эффективен?
- В таблице пользователей есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
- Все вопросы по «Агрегация, GROUP BY и HAVING» →