Классифицировать каждого активного в этом месяце пользователя как new или returning одним запросом
Таблица activity(user_id, activity_date) содержит по одной строке на активный день пользователя. Для каждого пользователя, активного в текущем календарном месяце, поставьте метку new, если его первая в истории активность в этом месяце, или returning, если он был активен раньше. Верните по одной строке на такого пользователя.
-- на активного-в-этом-месяце: 'new' или 'returning'
Напишите запрос.
GROUP BY user_id по всей активности. Пользователь new, когда MIN(activity_date) попадает в текущий месяц, иначе returning. Оставляют активных в этом месяце через HAVING MAX(activity_date) >= date_trunc('month', CURRENT_DATE).
- ✗Решать new или returning по числу визитов за месяц
- ✗Брать MAX(activity_date) вместо MIN для проверки первого визита
- ✗Фильтровать на этот месяц до расчёта первой активности за всё время
- →Почему проверку первого визита ведут по всей истории, а не только за месяц?
- →Как добавить третью метку
resurrectedдля вернувшихся после паузы?
Group once over the user's whole history so the first-ever activity is available, then decide the label from it and keep only users seen this month:
SELECT user_id,
CASE WHEN MIN(activity_date) >= date_trunc('month', CURRENT_DATE)::date
THEN 'new' ELSE 'returning' END AS user_type
FROM activity
GROUP BY user_id
HAVING MAX(activity_date) >= date_trunc('month', CURRENT_DATE)::date;
MIN(activity_date) is the user's first-ever active day; if that day is in the current month, this month is their debut → new. HAVING MAX(...) keeps only users with at least one activity this month. The subtle trap: filtering to the current month in WHERE before aggregating would make every user look brand-new, because the pre-month history it needs would already be gone.