← Назад к вопросам
SQL: Сессионизация событий
2.2 Middle🔥 171 комментариев
#SQL и базы данных#Метрики продукта#Статистика и математика
Условие
У вас есть таблица user_events:
- event_id (integer)
- user_id (integer)
- event_time (timestamp)
- event_type (varchar)
Определите сессии пользователей, считая новой сессией события, которые происходят с интервалом более 30 минут.
Ожидаемый результат:
Таблица с колонками: user_id, session_id, session_start, session_end, events_in_session
Источник: задача на сессионизацию данных
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Сессионизация событий SQL
WITH events_ranked AS ( SELECT
user_id,
event_id,
event_time,
LAG(event_time) OVER (PARTITION BY user_id ORDER BY event_time) as prev_time,
CASE
WHEN prev_time IS NULL THEN 1
WHEN EXTRACT(EPOCH FROM (event_time - prev_time)) / 60 > 30 THEN 1
ELSE 0
END as session_start
FROM user_events ),
sessions AS ( SELECT
user_id,
event_id,
event_time,
CONCAT(user_id, '_', SUM(session_start) OVER (PARTITION BY user_id ORDER BY event_time)) as session_id
FROM events_ranked
)
SELECT user_id, session_id, MIN(event_time) as session_start, MAX(event_time) as session_end, COUNT(*) as events_in_session FROM sessions GROUP BY user_id, session_id
Объяснение:
- LAG вычисляет время предыдущего события
- Новая сессия начинается если это первое событие или >30 минут прошло
- SUM() OVER создает приращивающийся счетчик для группировки
- GROUP BY агрегирует события по сессиям