NTILE в SQL: как разбить пользователей на группы по активности
Практика NTILE в SQL для сегментации пользователей по выручке, активности и latency без ручных порогов и спорных границ.
Содержание статьи
Ручные границы вроде «больше пяти действий — активный» быстро устаревают. NTILE помогает построить относительные группы, но не превращает статистическое ранжирование в бизнес-сегмент автоматически. Как разделить пользователей на равные по размеру группы, если заранее неизвестны хорошие пороги?
Когда пригодится подход
Как разделить пользователей на равные по размеру группы, если заранее неизвестны хорошие пороги?
Ручные границы вроде «больше пяти действий — активный» быстро устаревают. NTILE помогает построить относительные группы, но не превращает статистическое ранжирование в бизнес-сегмент автоматически.
Квинтили по недельной активности позволяют сравнить top 20% с остальными. Но одинаковый размер групп не означает одинаковую ценность: один пользователь может иметь много технических событий.
Договорённости до расчёта
Одна строка для NTILE должна быть user × period. Нельзя ранжировать сырые события и потом называть корзины сегментами пользователей.
Сначала агрегируй факты до user_id и периода, затем добавь NTILE поверх явной сортировки. Для стабильного результата укажи tie-breaker и реши, как обрабатывать NULL и нулевые значения.
Если показатель строится по событиям, отдельно проверь повторную отправку, идентичность пользователя и часовой пояс. Если данные приходят из бизнес-системы, сопоставь техническое поле с тем, как команда реально принимает решение.
вопрос → объект → период → расчёт → проверка → решениеЛюбой пропущенный шаг может изменить смысл итогового числа.
Пример с данными
Квинтили по недельной активности позволяют сравнить top 20% с остальными. Но одинаковый размер групп не означает одинаковую ценность: один пользователь может иметь много технических событий.
Не копируй пример в рабочий отчёт вслепую. Сначала замени названия таблиц и полей, проверь кардинальность связей и запиши, какие строки должны попасть в результат. Хорошая адаптация сохраняет логику, но делает допущения видимыми.
| Подход | Порог | Плюс | Риск |
|---|---|---|---|
| NTILE | 20% группы | сопоставимый размер | граница меняется |
| Rule | >= 5 действий | понятно бизнесу | неравные группы |
| Hybrid | квинтиль + minimum | баланс | сложнее объяснить |
WITH weekly AS (\n SELECT user_id, COUNT(*) AS actions\n FROM events\n WHERE event_name = 'core_action' AND event_at >= DATE '2026-07-01' AND event_at < DATE '2026-08-01'\n GROUP BY user_id\n)\nSELECT user_id, actions, NTILE(5) OVER (ORDER BY actions, user_id) AS activity_quintile\nFROM weekly;Ограничения метода
Нестабильный ORDER BY, неполные периоды и пересчёт групп после каждого нового пользователя затрудняют сравнение. Для бизнес-правил часто лучше фиксированный порог.
Отдельно протестируй пустой результат, NULL, дубль, граничную дату и объект без связанной записи. Эти случаи не являются редкими исключениями: именно они чаще всего превращают рабочий показатель в красивую, но неверную цифру.
- Не смешивай зрелые и незрелые периоды без отдельной подписи.
- Не заменяй проверку качества тем, что запрос просто выполнился.
- Не делай причинный вывод из одного разреза.
Сравнение на графике
График здесь нужен не для украшения статьи. Он помогает увидеть форму сигнала: тренд, разрыв между сегментами, хвост распределения или этап, на котором теряется объект. Сначала прочитай оси и единицы, затем сравни с таблицей и только после этого формулируй вывод.
На визуализации «Распределение пользователей по квинтилям» сравнивай не только максимальное значение. Проверь, одинаковы ли базы, не скрыта ли неполная дата и не меняется ли знаменатель от категории к категории.
Условный пример: размер групп похож, но значение метрики растёт неравномерно.
Самостоятельная проверка
Раздели пользователей на квинтили по числу core_action и сравни в группах retention и revenue. Посмотри, совпадают ли активность и ценность.
После упражнения напиши вывод в двух версиях. Первая — техническая: какие строки и условия дали результат. Вторая — для команды: что изменилось, насколько это надёжно и какое действие стоит проверить. Если эти версии противоречат друг другу, вернись к определению показателя.
- Собери контрольный пример из пяти-десяти строк.
- Сверь итог с независимым способом расчёта.
- Проверь хотя бы один крайний случай.
- Зафиксируй дату, версию схемы и ограничение.
Следующий шаг
Используй NTILE для исследования и относительного сравнения. Для коммуникации с CRM или продуктом закрепляй понятные правила и проверяй, не дрейфуют ли границы.
Сильный аналитический материал не обещает абсолютной уверенности. Он показывает, как получить число, где оно может ошибиться и какое решение можно принять уже сейчас. Такой формат хорошо переносится в дашборд, SQL-тренажёр, собеседование и рабочее обсуждение с командой.
Материалы по теме
NOT EXISTS и anti-join в SQL: как найти пользователей без события
Практический разбор NOT EXISTS и anti-join: пользователи без покупки, заказы без возврата и сегменты, которые не дошли до следующего шага.

Коррелированный подзапрос: как он выполняется и чем его заменить
Почему коррелированный подзапрос выполняется для каждой строки, когда он оправдан, как заменить его оконной функцией или предагрегацией и не изменить при этом смысл расчёта.

RANK, DENSE_RANK и ROW_NUMBER: топ-N внутри каждой группы
Как построить рейтинг в SQL: чем отличаются RANK, DENSE_RANK и ROW_NUMBER, что делать с ничьими и почему оконную функцию нельзя фильтровать в том же WHERE.