Сравнение Premium и обычных пользователей
// Условие
Сравните Premium и обычных пользователей: для каждой группы (is_premium) посчитайте количество пользователей (user_count), общее количество завершённых заказов (order_count) и среднее количество заказов на пользователя (avg_orders_per_user, округлить до 2 знаков). Отсортируйте по is_premium по убыванию (Premium первым).
// Таблицы
user_id | INT |
registration_date | DATE |
acquisition_channel | VARCHAR(20) |
platform | VARCHAR(10) |
city | VARCHAR(50) |
is_premium | BOOLEAN |
order_id | INT |
user_id | INT |
order_date | TIMESTAMP |
amount | NUMERIC(10,2) |
status | VARCHAR(20) |
delivery_days | INT |
promo_code | VARCHAR(20) |
// Что тренирует
// Решение
Подсказка
LEFT JOIN users → orders (чтобы не потерять пользователей без заказов). COUNT(DISTINCT u.user_id) для user_count, COUNT(o.order_id) для order_count.
Сначала попробуй сам → Показать решение
SELECT
u.is_premium,
COUNT(DISTINCT u.user_id) AS user_count,
COUNT(o.order_id) AS order_count,
ROUND(COUNT(o.order_id)::numeric / COUNT(DISTINCT u.user_id), 2) AS avg_orders_per_user
FROM sandbox.users u
LEFT JOIN sandbox.orders o
ON u.user_id = o.user_id
AND o.status = 'completed'
GROUP BY u.is_premium
ORDER BY u.is_premium DESC;
Три ключевых момента: (1) LEFT JOIN — чтобы включить пользователей без заказов; (2) условие status = 'completed' стоит в ON, а не в WHERE — иначе LEFT JOIN превратится в INNER JOIN и потеряет пользователей без заказов; (3) ::numeric перед делением — иначе PostgreSQL сделает целочисленное деление. Это ловушка, в которую попадает ~60% кандидатов.