SQLОконные функцииHardБесплатно

Децили пользователей по тратам

// Условие

Разбейте пользователей на 10 равных групп (децилей) по суммарным тратам на завершённые заказы. Для каждого дециля посчитайте количество пользователей (user_count), минимальные и максимальные траты в дециле (min_spent, max_spent), и долю от общей выручки (revenue_share, в процентах, округлить до 1). Выведите decile (1 = самые мало тратящие, 10 = топ), user_count, min_spent, max_spent, revenue_share.

// Таблицы

sandbox.orders
order_idINT
user_idINT
order_dateTIMESTAMP
amountNUMERIC(10,2)
statusVARCHAR(20)
delivery_daysINT
promo_codeVARCHAR(20)

// Что тренирует

NTILEДецилиДоля выручки
▶ Решить в SQL-песочнице

// Решение

Подсказка

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 + подзапрос для общей суммы.

// Похожие задачи

// Разобраться в теме

→ Оконные функции SQL