Получить доступ

Как разбить поток событий на сессии на SQL?

MiddleSQL для аналитикаSQL
Ещё спрашивают так:
  • Как посчитать длительность сессии?
Коротко

Сессия — серия событий пользователя без пауз дольше порога (обычно 30 минут). LAG даёт время предыдущего события; где пауза больше порога — флаг начала новой сессии; нарастающая сумма флагов по пользователю — номер сессии. Дальше агрегаты по (пользователь, номер сессии).

  • Порог выбирают по распределению пауз, а не наугад
  • Сессии, пересекающие полночь, не режут по датам
  • Длительность сессии из одного события — ноль; это нужно учитывать в средних

А ещё Веб-аналитика (Яндекс Метрика, GA) определяет сессии по своим правилам — цифры могут не совпасть

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Выбор порога. Построить гистограмму пауз между соседними событиями пользователя: обычно видна «впадина» между короткими паузами внутри сессии и длинными между визитами. 30 минут — распространённое значение по умолчанию.

Тонкости: события с одинаковым временем — добавить второй ключ сортировки; события из разных устройств одного пользователя — решить, объединять ли; длительность считать до последнего события, а не до ухода — ухода мы не видим.

Пример

WITH marked AS (
  SELECT user_id, event_time,
         CASE WHEN event_time - LAG(event_time) OVER w > INTERVAL '30 minutes'
                OR LAG(event_time) OVER w IS NULL THEN 1 ELSE 0 END AS new_session
  FROM events
  WINDOW w AS (PARTITION BY user_id ORDER BY event_time)
),
numbered AS (
  SELECT *, SUM(new_session) OVER (PARTITION BY user_id ORDER BY event_time
                                   ROWS UNBOUNDED PRECEDING) AS session_no
  FROM marked
)
SELECT user_id, session_no,
       MIN(event_time) AS started,
       MAX(event_time) - MIN(event_time) AS duration,
       COUNT(*) AS events
FROM numbered
GROUP BY user_id, session_no;

Что хотят услышать

  • Флаг новой сессии через LAG и нарастающую сумму.
  • Выбор порога.
  • Ограничения: последнее событие, устройства.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем