SQL топ-N в каждой группе: два товара по продажам
Чтобы выбрать топ-N внутри категории, обычно нужны два уровня расчёта: сначала итог по товару, затем его место среди товаров своей категории. Один общий LIMIT ограничит весь отчёт, а не каждую группу.
Заранее решите, как обрабатывать равные итоги. ROW_NUMBER, RANK и DENSE_RANK имеют разное поведение при совпадениях. Следуйте указанному в задаче правилу и добавьте детерминированный порядок там, где он требуется.
Проверьте решение без регистрации. Объяснения и последовательная практика — в курсе «SQL с нуля: бесплатный курс с практикой».
Топ-2 товара в каждой категории
В магазине накопилась история заказов, и теперь хочется понять, какие товары пользуются наибольшим спросом — причём отдельно внутри каждой категории. Суммарное количество проданных единиц уже говорит само за себя, но интереснее всего посмотреть, кто реально держит верхние позиции.
Для каждого товара из таблиц products и order_items нужно подсчитать суммарное количество проданных единиц total_qty, а затем присвоить плотный ранг qty_rank внутри его категории — от большего объёма продаж к меньшему. Если два товара в одной категории продались одинаково, они получают одинаковый ранг, и оба остаются в выборке.
В итоговый результат попадают только строки с рангом не выше двух. Запрос должен вернуть поля category, product_id, title, total_qty и qty_rank, упорядоченные сначала по category, затем по qty_rank и, наконец, по product_id — всё по возрастанию. Товары, которые ни разу не фигурировали в заказах, в расчёт не берутся.
Пример
- Подготовка данных
INSERT INTO products (product_id, title, category) VALUES (1, 'Atlas', 'Books'), (2, 'Novel', 'Books'), (3, 'Comic', 'Books'), (4, 'Ball', 'Games'), (5, 'Chess', 'Games'), (6, 'Unused', 'Books'); INSERT INTO order_items (item_id, order_id, product_id, quantity) VALUES (1, 101, 1, 3), (2, 102, 1, 2), (3, 103, 2, 4), (4, 104, 3, 4), (5, 105, 4, 10), (6, 106, 5, 5);
- Вывод
Books|1|Atlas|5|1 Books|2|Novel|4|2 Books|3|Comic|4|2 Games|4|Ball|10|1 Games|5|Chess|5|2
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- SQL JOIN и HAVING: клиенты с крупной суммой заказов
- Последняя запись в группе SQL: заказ каждого клиента
- SQL GROUP BY и SUM: задача на выручку по категориям
- SQL HAVING SUM: отобрать группы по сумме продаж
- SQL WHERE, GROUP BY и AVG: средний чек по регионам
- SQL INNER JOIN: соединить заказы с именами клиентов
