Доля покупателей с повторным заказом
У интернет-магазина есть выгрузка заказов за сентябрь. Команда хочет понять, сколько покупателей вернулись за второй покупкой в том же месяце.
Условие
Найди число покупателей с хотя бы одним оплаченным заказом, число покупателей с двумя и более оплаченными заказами и долю второй группы в первой. Отменённые заказы не считаются. Один order_id — один заказ; таблица не содержит дублей. Доля должна быть в процентах с двумя знаками после запятой.
Данные
| order_id | user_id | status | amount |
|---|---|---|---|
| 1 | 101 | paid | 1200 |
| 2 | 101 | paid | 800 |
| 3 | 102 | paid | 500 |
| 4 | 103 | paid | 2000 |
| 5 | 103 | paid | 700 |
| 6 | 104 | paid | 900 |
| 7 | 105 | cancelled | 1500 |
Все данные учебные. Код можно выполнить в своей среде; поле ниже предназначено для черновика, без запуска кода.
Если нужен следующий шаг
Подсказка 1
Подсказка 2
Проверь себя
Показать решение и объяснение
WITH buyers AS (
SELECT user_id, COUNT(*) AS orders_count
FROM orders
WHERE status = 'paid'
GROUP BY user_id
)
SELECT COUNT(*) AS buyers,
SUM(CASE WHEN orders_count >= 2 THEN 1 ELSE 0 END) AS repeat_buyers,
ROUND(100.0 * SUM(CASE WHEN orders_count >= 2 THEN 1 ELSE 0 END)
/ NULLIF(COUNT(*), 0), 2) AS repeat_share_pct
FROM buyers;Два уровня агрегации отвечают на два разных вопроса: сколько заказов у человека и сколько таких людей в базе. Множитель 100.0 сохраняет дробную часть; NULLIF защищает от деления на ноль. В пустой выборке доля будет NULL: это отсутствие наблюдений, а не нулевая повторная покупка.
Проверка решения
- Покупатель 105 исключён вместе с отменённым заказом.
- Покупатели 102 и 104 остаются в знаменателе.
- При отсутствии оплаченных заказов запрос не делит на ноль.
Вопрос на продолжение
Как изменится расчёт, если считать вторую покупку за всю историю, а не внутри месяца? Какие поля понадобятся для повторной покупки в течение 30 дней?