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.