Нужно получить топ-3 продукта по выручке внутри каждой категории. Какой подход корректен в PostgreSQL?
AНаписать
GROUP BY category ORDER BY revenue DESC LIMIT 3 — лимит применится внутри каждой группыBДобавить
HAVING RANK() <= 3 к обычному GROUP BY-запросу с сортировкойCИспользовать
DISTINCT ON (category) с ORDER BY category, revenue DESC LIMIT 3DИспользовать
ROW_NUMBER() OVER (PARTITION BY category ORDER BY revenue DESC) в подзапросе, затем отфильтровать по номеру строкиПравильный ответ. Паттерн «топ-N внутри группы» требует оконной функции
ROW_NUMBER() OVER (PARTITION BY ...) с последующей фильтрацией по номеру строки во внешнем запросе.Разбор
LIMIT без оконной функции ограничивает весь результат запроса, а не каждую группу отдельно. DISTINCT ON (category) даёт только топ-1. HAVING не знает о позиции строки внутри группы. Правильный подход: в CTE или подзапросе присвоить ROW_NUMBER() OVER (PARTITION BY category ORDER BY revenue DESC) AS rn, затем во внешнем запросе написать WHERE rn <= 3. При ничьих можно использовать RANK() вместо ROW_NUMBER().
Проверь себя · 1/3разбор после ответа
Нужно получить количество заказов по паре (
user_id, status) из таблицы orders. Какой запрос верный?Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»
- Что делает оператор `DISTINCT`?
- Что делает `HAVING`?
- Есть таблица `orders(user_id, amount)`. Какой запрос посчитает сумму всех заказов по каждому пользователю?
- Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице `orders` есть поля `user_id`, `amount`, `status`. Какой запрос корректен и наиболее эффективен?
- В таблице `users` есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
- Все вопросы по «Агрегация, GROUP BY и HAVING» →