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