Как посчитать New Users в SQL
Содержание:
Зачем New Users
Маркетинг отчитывается: «150K новых пользователей в апреле». Аналитик копает: 30% этого — повторные регистрации (юзер забыл пароль), 20% — боты, 10% — реальные новые на конкретном устройстве (юзер уже был). Реальные new users — 60K.
Что такое New User
New User — пользователь, первая активность которого попадает в исследуемый период.
New = MIN(activity) ∈ periodБазовый расчёт
Данные: users(user_id, signup_date) или events(user_id, event_date).
SELECT
DATE_TRUNC('month', signup_date) AS month,
COUNT(DISTINCT user_id) AS new_users
FROM users
WHERE signup_date >= '2026-01-01'
GROUP BY 1
ORDER BY 1;Если только events:
WITH first_event AS (
SELECT user_id, MIN(event_date) AS first_date
FROM events
GROUP BY user_id
)
SELECT
DATE_TRUNC('month', first_date) AS month,
COUNT(*) AS new_users
FROM first_event
WHERE first_date >= '2026-01-01'
GROUP BY 1
ORDER BY 1;New Users по channels
SELECT
DATE_TRUNC('month', signup_date) AS month,
acquisition_channel,
COUNT(DISTINCT user_id) AS new_users
FROM users
WHERE signup_date >= '2026-01-01'
GROUP BY 1, 2
ORDER BY 1, new_users DESC;Cross-device дедупликация
Юзер заходит с телефона (device_id A), потом с ПК (device_id B). Без unification — два user_id, два «new».
-- Допустим, есть user_links(device_id, user_id) с unified user_id
WITH unified AS (
SELECT
ul.user_id AS unified_user_id,
MIN(e.event_date) AS first_event
FROM events e
JOIN user_links ul ON ul.device_id = e.device_id
GROUP BY ul.user_id
)
SELECT
DATE_TRUNC('month', first_event) AS month,
COUNT(*) AS new_users_unified
FROM unified
WHERE first_event >= '2026-01-01'
GROUP BY 1
ORDER BY 1;Частые ошибки
Ошибка 1. Считать new по device_id. Кросс-девайс юзеры дублируются. Используйте user_id (после login) если есть.
Ошибка 2. Включать ботов.
Без is_bot = false new users завышены.
Ошибка 3. Boundary period. Если юзер пришёл в 23:59 31 марта, signup_date в UTC может быть 1 апреля. Зафиксируйте timezone.
Ошибка 4. Повторные регистрации. Юзер забыл пароль и зарегистрировался заново с другой почтой. Объединяйте по device fingerprint.
Ошибка 5. Соотношение new vs returning. Только new users — не вся картина. Сравните new vs returning per period.
Связанные темы
- Как посчитать DAU в SQL
- Как посчитать MAU в SQL
- Как посчитать retention в SQL
- Как посчитать reactivation в SQL
FAQ
Cross-device или per-device?
Cross-device через unified user_id — точнее. Per-device проще, но завышен.
Как фильтровать ботов?
User-agent, geo-anomaly, behavioral (немедленный bounce, exotic device). Лучше использовать готовые антибот-системы (Recaptcha, Akamai).
New users падают — что делать?
Декомпозиция по acquisition channels. Найдите канал с самым большим падением.
New vs Returning?
New — первая активность. Returning — был активен раньше + сейчас. Total active = new + returning.
Boundary date — куда?
Зарегистрировался 31 марта 23:50 UTC = 1 апреля 02:50 МСК. Зафиксируйте timezone для consistency.