У тебя есть таблица логов. Нужно найти пользователей, которые заходили 3 дня подряд.
Таблица:
- user_id
- event_date (DATE)
Задача:
Верни
user_id и дату третьего дня серии (то есть конец 3-дневной цепочки).Ловушка:
1) В один день может быть несколько событий - их нельзя считать как разные дни
2) Дни должны идти подряд по календарю (не “3 записи подряд”)
-- PostgreSQL / MySQL 8+ (через window functions)
WITH uniq_days AS (
SELECT DISTINCT user_id, event_date
FROM user_events
),
grp AS (
SELECT
user_id,
event_date,
event_date
- INTERVAL '1 day' * (ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY event_date))
AS anchor
FROM uniq_days
),
runs AS (
SELECT
user_id,
MIN(event_date) AS start_day,
MAX(event_date) AS end_day,
COUNT(*) AS days_cnt
FROM grp
GROUP BY user_id, anchor
)
SELECT user_id, end_day AS third_day
FROM runs
WHERE days_cnt >= 3
ORDER BY user_id, third_day;
Почему это работает:
-
DISTINCT убирает повторы в один день- “anchor” превращает подряд идущие даты в одну группу
- дальше считаем длину серии и берём конец