Короткий ответ
Нужно найти для каждого пользователя дату первого события (или регистрации), сгруппировать эти даты по месяцу и посчитать число уникальных пользователей в каждом месяце.
Как это работает подробнее
"новый пользователь" — тот, для кого текущий месяц совпадает с месяцем его самой первой активности; это требует предварительного вычисления MIN(date) по каждому user_id, а не просто фильтрации событий по месяцу.
Пример кода
product_metrics.sql
-- PostgreSQL
SELECT
date_trunc('month', first_event)::date AS month,
COUNT(*) AS new_users
FROM (
SELECT user_id, MIN(event_date) AS first_event
FROM events
GROUP BY user_id
) t
GROUP BY 1
ORDER BY 1;Что использовать на практике
- Применение. если в таблице уже есть отдельное поле registration_date, можно обойтись без вычисления минимума по событиям — но важно убедиться, что registration_date действительно отражает первый визит, а не, например, дату подтверждения email.
- Проверка или пример. Проверка: сумма new_users по всем месяцам должна равняться общему числу уникальных пользователей в таблице events.
Подводные камни
- Частая ошибка. считают число новых пользователей просто как число уникальных user_id с любой активностью в месяце (это посчитает и старых, вернувшихся пользователей, а не только новых); не учитывают часовой пояс при использовании date_trunc, из-за чего пользователи "переезжают" в соседний месяц.