Топ-5 категорий по количеству заказов
// Условие
Для каждой категории товаров посчитайте количество уникальных завершённых заказов, в которых есть хотя бы один товар этой категории. Выведите category и order_count. Топ-5 по убыванию.
// Таблицы
sandbox.orders
order_id | INT |
user_id | INT |
order_date | TIMESTAMP |
amount | NUMERIC(10,2) |
status | VARCHAR(20) |
delivery_days | INT |
promo_code | VARCHAR(20) |
sandbox.order_items
item_id | INT |
order_id | INT |
product_id | INT |
quantity | INT |
unit_price | NUMERIC(10,2) |
sandbox.products
product_id | INT |
product_name | VARCHAR(100) |
category | VARCHAR(30) |
price | NUMERIC(10,2) |
seller_id | INT |
// Что тренирует
JOINCOUNT DISTINCTGROUP BYLIMIT
// Решение
Подсказка
Нужна цепочка JOIN: orders → order_items → products. COUNT(DISTINCT order_id) — один заказ может содержать несколько товаров одной категории.
Сначала попробуй сам → Показать решение
SELECT
p.category,
COUNT(DISTINCT o.order_id) AS order_count
FROM sandbox.orders o
JOIN sandbox.order_items oi ON o.order_id = oi.order_id
JOIN sandbox.products p ON oi.product_id = p.product_id
WHERE o.status = 'completed'
GROUP BY p.category
ORDER BY order_count DESC
LIMIT 5;
Цепочка из трёх JOIN — частый паттерн в e-commerce. Ключевой момент: COUNT(DISTINCT o.order_id). Без DISTINCT один заказ с 3 товарами категории electronics будет посчитан 3 раза. На собеседовании за это снимают баллы.