Децили пользователей по тратам
// Условие
Разбейте пользователей на 10 равных групп (децилей) по суммарным тратам на завершённые заказы. Для каждого дециля посчитайте количество пользователей (user_count), минимальные и максимальные траты в дециле (min_spent, max_spent), и долю от общей выручки (revenue_share, в процентах, округлить до 1). Выведите decile (1 = самые мало тратящие, 10 = топ), user_count, min_spent, max_spent, revenue_share.
// Таблицы
order_id | INT |
user_id | INT |
order_date | TIMESTAMP |
amount | NUMERIC(10,2) |
status | VARCHAR(20) |
delivery_days | INT |
promo_code | VARCHAR(20) |
// Что тренирует
// Решение
Подсказка
NTILE(10) OVER (ORDER BY total_spent) — разбивает на равные группы. Потом GROUP BY decile.
Сначала попробуй сам → Показать решение
WITH user_totals AS (
SELECT
user_id,
SUM(amount) AS total_spent
FROM sandbox.orders
WHERE status = 'completed'
GROUP BY user_id
),
with_decile AS (
SELECT
user_id,
total_spent,
NTILE(10) OVER (ORDER BY total_spent) AS decile
FROM user_totals
)
SELECT
decile,
COUNT(*) AS user_count,
ROUND(MIN(total_spent), 2) AS min_spent,
ROUND(MAX(total_spent), 2) AS max_spent,
ROUND(100.0 * SUM(total_spent) / (SELECT SUM(total_spent) FROM with_decile), 1) AS revenue_share
FROM with_decile
GROUP BY decile
ORDER BY decile;
NTILE(10) равномерно разбивает отсортированные строки на 10 групп. Дециль 10 — топ-10% по тратам. Классический вопрос на собесе: «какой процент выручки даёт топ-10% пользователей?» (обычно 40–60%, закон Парето). Это задача на NTILE + GROUP BY + подзапрос для общей суммы.