← Назад к вопросам

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 агрегирует события по сессиям
SQL: Сессионизация событий | PrepBro