- Зачем:
- программа лаб (спека 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>
90 lines
6.1 KiB
Markdown
90 lines
6.1 KiB
Markdown
# Нарежь сессии сам
|
||
|
||
**Чему учит:** собрать сессии из событий и сверить их число с внешним
|
||
эталоном. Найти причину расхождения в отдельных строках.
|
||
|
||
## Сначала прочитать
|
||
|
||
- [Хранилище и его слои, раздел 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` дает сводку по дням и список кук;
|
||
- [ ] при разборе расхождения указаны кука, день, два события и причина;
|
||
- [ ] уточненный расчет дает ноль расхождений во всех днях.
|