Как разбить события на сессии в SQL по паузе между действиями
Для внутреннего продукта требуется собственное определение сессии: новая начинается после паузы больше тридцати минут. Количество событий ещё не даёт количество посещений; сначала нужно обнаружить границы внутри последовательности каждого пользователя.
Как разобрать ситуацию
Возьмём время в целых минутах от общего начала. LAG показывает предыдущее действие. Первое событие и разрыв больше порога становятся маркерами новой сессии. Накопительная сумма этих маркеров даёт номер сессии. Две оконные операции разнесены по CTE, чтобы расчёт был понятен и выполнялся последовательно.
Пример и ожидаемый результат
Пользователь действовал на минутах 0, 10, 45 и 60. Между вторым и третьим событием 35 минут, поэтому ожидаем две сессии с номерами 1, 1, 2 и 2.
WITH e(t) AS(VALUES(0),(10),(45),(60)), prev AS(
SELECT t,LAG(t) OVER(
ORDER BY t) p
FROM e), marks AS(
SELECT t,CASE WHEN p IS NULL OR t-p>30 THEN 1 ELSE 0 END start
FROM prev)
SELECT t,SUM(start) OVER(
ORDER BY t ROWS UNBOUNDED PRECEDING)
FROM marks
ORDER BY t;Получаются пары минут и сессий: (0, 1), (10, 1), (45, 2), (60, 2). Каждое событие принадлежит ровно одной сессии.
Проверка перед применением
- Проверьте паузу ровно 30 минут: при выбранном правиле это продолжение прежней сессии.
- Добавьте второго пользователя с теми же минутами: нумерация должна начаться заново.
- Уберите повторные события или задайте порядок для равного времени, если они влияют на дальнейшие действия.
Сохраните рядом с отчётом выбранный порог и знак сравнения. Когда продукт меняет правило с тридцати до шестидесяти минут, это новая версия метрики. Сравнивать старое и новое количество сессий без пересчёта истории нельзя: скачок может возникнуть исключительно из-за определения.
Границы решения
Это пользовательское правило, а не точное воспроизведение конкретного счётчика аналитики. Часовые пояса, поздняя доставка и события вне порядка требуют отдельной обработки до расчёта.
Если запросы уже пишутся, а уверенности в кардинальности, оконных рамках и проверке результата не хватает, продолжить практику можно в нашем платном курсе
Продвинутый SQL: сложные запросы и задачи для собеседований. Перед записью сравните программу со своей задачей и подготовкой.
Техническая справка: www.sqlite.org: документация.
Следующий шаг: Сложные SQL-запросы: разборы расчётов и ошибок. По смежным вопросам: Подписка на часть месяца: как посчитать пропорциональную сумму в SQL, Как распределить скидку заказа по товарам в SQL без потерянной копейки.
