Ответ вслух Middle SQL дата-инженера спрашивают часто обновлено

Как посчитать сессии на SQL

Вопрос

Как вы на SQL разобьёте поток событий на сессии и посчитаете среднюю длительность сессии?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Сначала договоримся об определении: новая сессия начинается, если с прошлого события пользователя прошло больше 30 минут. Перед этим убираю дубли событий.

Что должно прозвучать в ответе

  • Определить сессию: пауза больше порога, обычно 30 минут

  • LAG по пользователю в порядке времени

  • Флаг начала сессии и нарастающая сумма флагов как номер сессии

  • Группировка по пользователю и номеру: начало, конец, число событий

  • Средняя длительность по сессиям, решение для сессий из одного события

  • Дедупликация событий до сессионизации

Что могут спросить следом

  • Как сделать это инкрементально каждый час?
  • Что делать с сессией, которая переходит через полночь?

Разбор

Образцовый ответ: «Сначала договоримся об определении: новая сессия начинается, если с прошлого события пользователя прошло больше 30 минут. Перед этим убираю дубли событий. Дальше LAG по пользователю в порядке времени даёт предыдущее событие, флаг ставится, если предыдущего нет или пауза больше порога. Нарастающая сумма флагов по пользователю даёт номер сессии. Группирую по пользователю и номеру сессии: минимум и максимум времени, число событий. Длительность это разность, средняя считается по сессиям. Отдельно решаю, что делать с сессиями из одного события: их длительность ноль, и они тянут среднее вниз, иногда их исключают или добавляют фиксированную длительность. При инкрементальном расчёте пересчитываю хвост: последнюю сессию пользователя за прошлый период, потому что новые события могут её продолжить».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.