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

90 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Нарежь сессии сам
**Чему учит:** собрать сессии из событий и сверить их число с внешним
эталоном. Найти причину расхождения в отдельных строках.
## Сначала прочитать
- [Хранилище и его слои, раздел DDS](../handbook/storage-layers.md#dds-язык-бизнеса);
- [формат события: Идентификаторы и время](../formats/clickstream-event.md#идентификаторы-и-время).
## Роль сессии
Визит, или сессия, объединяет действия посетителя за один заход на сайт.
По визитам аналитик считает длительность и глубину просмотра.
В хранилище сессии собираются из отдельных событий.
Сверьте самостоятельный расчет с `VisitID`, чтобы увидеть, как из событий
получается сессия.
## Что сделать
### Нарезка
В SQL Lab или DBeaver под `analyst` напишите запрос к `ods.event_v`.
Для своей нарезки и эталона возьмите одни и те же строки за все доступные
дни: для расследования понадобятся события соседних дней.
Выберите `ClientID`, `UTCEventTime`, `EventDate`, `EventType` и `VisitID`.
В `dds.event_v` эталонного `VisitID` нет.
Для начала считайте визитом последовательные события одной куки (`ClientID`);
пауза дольше 30 минут открывает новый визит.
Учитывайте события всех типов. Упорядочите их по `UTCEventTime`.
Присвойте каждому событию номер своей сессии внутри куки.
Подсказка: оконные функции.
Днем сессии считайте `EventDate` ее первого события: дата из `UTCEventTime`
отличается от `EventDate` для части событий, поэтому берите `EventDate`.
При сверке останутся расхождения из-за еще одной договоренности стенда.
### Сверка с эталоном
В эталоне посчитайте число визитов каждой куки за модельный день:
```sql
SELECT ClientID, EventDate, uniqExact(VisitID) AS reference_sessions
FROM ods.event_v
GROUP BY ClientID, EventDate
ORDER BY EventDate, ClientID;
```
Посчитайте свои сессии по куке и дню сессии.
Соедините два готовых агрегата через `FULL OUTER JOIN` по куке и дню.
В результате полного соединения останутся ключи обеих сторон: при расхождении
на вашей стороне ключа может не быть совсем. Учтите такие строки при сравнении.
Выведите сводку по дням с числом разошедшихся кук и список этих кук
с днем и обоими значениями счета. Общая сумма за день могла бы скрыть
взаимную компенсацию ошибок разных кук. По списку видно, у кого искать причину.
Расхождений будет всего несколько. Если их нет, мир прожил мало дней.
Прогоните несколько дней через [даги модельного времени](../handbook/airflow-dags.md#даги-мира)
и повторите сверку.
### Расследование
Выберите одну разошедшуюся куку. Выведите ее события за два соседних дня
с `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` дает сводку по дням и список кук;
- [ ] при разборе расхождения указаны кука, день, два события и причина;
- [ ] уточненный расчет дает ноль расхождений во всех днях.