Нужно получить топ-3 продукта по выручке внутри каждой категории. Какой подход корректен в PostgreSQL?
A
GROUP BY category ORDER BY revenue DESC LIMIT 3: ограничение по числу строк применится к каждой категории отдельноB
HAVING RANK() <= 3 поверх обычной агрегации с GROUP BY category и сортировкой выручки по убываниюC
DISTINCT ON (category) с ORDER BY category, revenue DESC LIMIT 3 для выбора трёх лучших товаров категорииD
ROW_NUMBER() OVER (PARTITION BY category ORDER BY revenue DESC) в подзапросе с фильтром по номеру <= 3Правильный ответ. Паттерн «топ-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разбор после ответа
Есть таблица
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» →