Files
clickstream-data-platform/docs/labs/3-1-sessions-by-hand.md
T
ddadminandClaude Fable 5.1 c4f8051c70 docs(labs): добавлено ТЗ ступени 3 «Нарежь сессии сам»
- Зачем:
  - программа лаб (спека 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>
2026-09-06 10:17:34 -04:00

6.1 KiB
Raw Blame History

Нарежь сессии сам

Чему учит: собрать сессии из событий и сверить их число с внешним эталоном. Найти причину расхождения в отдельных строках.

Сначала прочитать

Роль сессии

Визит, или сессия, объединяет действия посетителя за один заход на сайт. По визитам аналитик считает длительность и глубину просмотра. В хранилище сессии собираются из отдельных событий. Сверьте самостоятельный расчет с 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 дает сводку по дням и список кук;
  • при разборе расхождения указаны кука, день, два события и причина;
  • уточненный расчет дает ноль расхождений во всех днях.