NTILE: разбиение на группы/доли

Что делает NTILE? 🔍

Функция NTILE — это мощный инструмент аналитики в SQL, который делит набор строк на указанное количество групп (бакетов) с примерно равным количеством элементов в каждой. Проще говоря, она помогает вам разбить данные на «корзины» или «доли» для дальнейшего анализа.

Представьте, что у вас есть список студентов с оценками, и вам нужно разделить их на 3 группы: слабые, средние и сильныеNTILE сделает это за вас автоматически!


Синтаксис и основные принципы 🛠️

NTILE(количество_групп) OVER (
    [PARTITION BY столбец1, столбец2, ...]
    ORDER BY столбец_для_сортировки [ASC|DESC]
)

🔹 количество_групп — на сколько частей делить данные (например, NTILE(4) создаст квартили).
🔹 PARTITION BY (опционально) — разбивает данные на группы перед применением NTILE (как GROUP BY, но внутри окна).
🔹 ORDER BY — определяет, по какому признаку сортировать строки перед разбиением.


Простой пример: разбиваем клиентов по тратам 💰

Допустим, у нас есть таблица customers с данными о покупках:

SELECT 
    customer_id,
    total_spent,
    NTILE(3) OVER (ORDER BY total_spent DESC) AS spending_group
FROM customers;

📌 Результат:

customer_id total_spent spending_group
101 1500 1
102 1200 1
103 800 2
104 500 2
105 300 3
106 100 3

💡 Что произошло?
- Клиенты разбиты на 3 группы по уровню трат.
- Группа 1 — топовые покупатели, группа 3 — те, кто тратит меньше всего.


NTILE с PARTITION BY: группы внутри категорий 🏷️

Теперь добавим разбивку по категориям товаров:

SELECT 
    customer_id,
    category,
    total_spent,
    NTILE(2) OVER (PARTITION BY category ORDER BY total_spent DESC) AS category_group
FROM purchases;

📌 Результат (пример):

customer_id category total_spent category_group
101 Electronics 1500 1
102 Electronics 900 1
103 Electronics 600 2
201 Clothing 700 1
202 Clothing 300 2

💡 Что изменилось?
- Данные сначала разделены по category, а затем внутри каждой категории — на 2 группы по тратам.
- В категории Electronics группа 1 — это клиенты с самыми высокими чеками.


Где это полезно? 🎯

1️⃣ Анализ клиентов
- Разделение на VIP / стандартных / новых.
- Выявление «среднего класса» покупателей.

2️⃣ А/В-тестирование
- Разбиение пользователей на группы для разных условий эксперимента.

3️⃣ Финансовый анализ
- Распределение доходов по квартилям / децилям.

4️⃣ HR-аналитика
- Группировка сотрудников по эффективности.


Важные нюансы ⚠️

🔸 Если количество строк не делится нацело, первые группы будут больше.
🔸 NTILE всегда старается распределить данные максимально равномерно.

Пример с 5 строками и NTILE(2):

Данные Группа
100 1
90 1
80 1
70 2
60 2

👉 Первая группа получила 3 строки, вторая — 2.


Практическое задание ✏️

Попробуйте применить NTILE к своей базе данных:
1. Разделите товары на 4 ценовые категории (квартили).
2. Разбейте заказы по сумме внутри каждого региона (PARTITION BY region).

💡 Подсказка: Для экспериментов можно использовать DB Fiddle.


В чём отличие от других оконных функций?

  • ROW_NUMBER — просто нумерует строки.
  • RANK / DENSE_RANK — ранжируют с пропусками / без пропусков.
  • NTILE — разбивает на группы, что особенно полезно для персентилей!

Хотите глубже разобрать оконные функции? Смотрите курс Данилы Бежина по SQL: YouTube.

Скрыть рекламу навсегда

🧠 Учёба без воды и зубрёжки

Закрытый Boosty с наработками опытного преподавателя.

Объясняю сложное так, чтобы щелкнуло.

🚀 Забрать доступ к Boosty