Sessionization: разбить event stream на сессии (30-min inactivity gap)

Senior SQL product

Условие задания

**Контекст:** Реальная задача из собеса в продуктовую команду. Есть поток событий юзеров, но нет явного `session_id` — нужно вычислить его из последовательности событий.

**Правило сессии:** события одного юзера принадлежат одной сессии, если между ними **не прошло больше 30 минут**. Первое событие после 30+ мин простоя — новая сессия.

**Данные:**

[см. код в задании]

Пример данных user_id=1:

| event_id | ts | event_type |
|---|---|---|
| 1 | 2026-04-01 10:00 | page_view |
| 2 | 2026-04-01 10:15 | click |
| 3 | 2026-04-01 10:40 | click | ← 25 мин после #2, та же сессия |
| 4 | 2026-04-01 11:30 | click | ← 50 мин после #3, НОВАЯ сессия |
| 5 | 2026-04-01 11:45 | purchase |

**Задание:** присвоить каждому событию `session_id` (глобально уникальный в рамках user_id + session_num).

**Ожидаемый результат:**
- 1, 2, 3 → session_num = 1 у user_id=1
- 4, 5 → session_num = 2 у user_id=1

Темы

sessionization window-functions LAG event-stream

Подсказки

Все тестовые задания → ← Все задания