- Зачем:
- программа лаб (спека 2026-09-01) требует ТЗ ступени 3: своя нарезка
визитов против эталона VisitID и расследование расхождения по строкам.
- Что:
- создан docs/labs/3-1-sessions-by-hand.md: нарезка по куке и паузе
30 минут над ods.event_v, сверка на зерне кука × день через
FULL OUTER JOIN, расследование одной разошедшейся куки.
- в docs/labs/README.md строка 3 программы ведет на ТЗ, фраза про будущие
ТЗ сдвинута на ступени 4–7.
- Проверка:
- make lint; запрос эталона выполнен на стенде под analyst.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
6.1 KiB
Нарежь сессии сам
Чему учит: собрать сессии из событий и сверить их число с внешним эталоном. Найти причину расхождения в отдельных строках.
Сначала прочитать
Роль сессии
Визит, или сессия, объединяет действия посетителя за один заход на сайт.
По визитам аналитик считает длительность и глубину просмотра.
В хранилище сессии собираются из отдельных событий.
Сверьте самостоятельный расчет с VisitID, чтобы увидеть, как из событий
получается сессия.
Что сделать
Нарезка
В SQL Lab или DBeaver под analyst напишите запрос к ods.event_v.
Для своей нарезки и эталона возьмите одни и те же строки за все доступные
дни: для расследования понадобятся события соседних дней.
Выберите ClientID, UTCEventTime, EventDate, EventType и VisitID.
В dds.event_v эталонного VisitID нет.
Для начала считайте визитом последовательные события одной куки (ClientID);
пауза дольше 30 минут открывает новый визит.
Учитывайте события всех типов. Упорядочите их по UTCEventTime.
Присвойте каждому событию номер своей сессии внутри куки.
Подсказка: оконные функции.
Днем сессии считайте EventDate ее первого события: дата из UTCEventTime
отличается от EventDate для части событий, поэтому берите EventDate.
При сверке останутся расхождения из-за еще одной договоренности стенда.
Сверка с эталоном
В эталоне посчитайте число визитов каждой куки за модельный день:
SELECT ClientID, EventDate, uniqExact(VisitID) AS reference_sessions
FROM ods.event_v
GROUP BY ClientID, EventDate
ORDER BY EventDate, ClientID;
Посчитайте свои сессии по куке и дню сессии.
Соедините два готовых агрегата через FULL OUTER JOIN по куке и дню.
В результате полного соединения останутся ключи обеих сторон: при расхождении
на вашей стороне ключа может не быть совсем. Учтите такие строки при сравнении.
Выведите сводку по дням с числом разошедшихся кук и список этих кук
с днем и обоими значениями счета. Общая сумма за день могла бы скрыть
взаимную компенсацию ошибок разных кук. По списку видно, у кого искать причину.
Расхождений будет всего несколько. Если их нет, мир прожил мало дней. Прогоните несколько дней через даги модельного времени и повторите сверку.
Расследование
Выберите одну разошедшуюся куку. Выведите ее события за два соседних дня
с UTCEventTime, EventDate, VisitID и номером своей сессии.
Сопоставьте сессии через события: общего ключа у двух нарезок нет,
зато у каждого события есть и VisitID, и присвоенный вами номер.
Найдите два соседних события, между которыми границы визитов разошлись.
Запишите куку, день, время обоих событий и причину одним предложением.
Уточните определение визита и добейтесь нуля расхождений во всех днях.
Как проверить себя
Результат задания проверяется глазами, поэтому задачи в homework_check
для него нет. Таблицы и представления создавать не нужно.
Сохраните исходный и уточненный расчеты, результаты сверки и найденные строки.
Предупреждение. В sql/dds/session_rebuild.sql и
sql/dq/sessions_vs_reference.sql лежат готовые запросы нарезки и сверки.
Откройте их после собственного решения и расследования. Сравните запросы
со своими: копирование готового SQL пропускает расследование.
Сопоставление со стендовой нарезкой по session_id остается на ступень 4.
Приемка
- запрос нарезает все события
ods.event_vза все доступные дни; - сверка через
FULL OUTER JOINдает сводку по дням и список кук; - при разборе расхождения указаны кука, день, два события и причина;
- уточненный расчет дает ноль расхождений во всех днях.