docs(labs): упрощен язык учебных заданий

- Зачем: начинающим трудно читать задания из-за необъясненных терминов и неестественных формулировок.
- Что: переработаны вводная и 21 задание, названы темы разделов, объяснены термины и сокращены повторы; согласованы правила учебного текста и ссылки.
- Проверка: сохранены 25 блоков SQL и команд и таблицы состава колонок; проверены 153 локальные ссылки и 32 входящие ссылки на разделы; git diff --check прошел.
This commit is contained in:
ddadmin committed 2026-10-18 18:09:43 +02:00
1 parent 3c3eb825e1
commit 4693bc5af9
24 files changed
+782 -684

No files matched your search

+34 -31
View File
@@ -1,35 +1,35 @@
# Нарежьте сессии сами
# Сессии из событий
**Чему учит:** собрать сессии из событий, сравнить их число с `VisitID`
источника и найти события, из-за которых расчеты расходятся.
Вы самостоятельно объедините события сайта в сессии и сравните их число
с готовыми визитами источника, обозначенными `VisitID`. Затем найдете
события, из-за которых расчеты расходятся.
## Сначала прочитать
## Подготовка
- [Хранилище и его слои, раздел 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 минут открывает новый визит.
`ClientID` хранится в cookie браузера и обозначает посетителя в событиях
сайта. Для начала считайте визитом последовательные события одного
`ClientID`: пауза дольше 30 минут открывает новый визит.
Учитывайте события всех типов. Упорядочите их по `UTCEventTime`.
Присвойте каждому событию номер своей сессии внутри куки.
Присвойте каждому событию номер своей сессии внутри `ClientID`.
Подсказка: оконные функции.
Днем сессии считайте `EventDate` ее первого события: дата из `UTCEventTime`
@@ -38,7 +38,8 @@
### Сверка с эталоном
В эталоне посчитайте число визитов каждой куки за модельный день:
Посчитайте по эталонному `VisitID` число визитов каждого `ClientID`
за модельный день:
```sql
SELECT ClientID, EventDate, uniqExact(VisitID) AS reference_sessions
@@ -47,46 +48,48 @@ GROUP BY ClientID, EventDate
ORDER BY EventDate, ClientID;
```
Посчитайте свои сессии по куке и дню сессии.
Соедините два готовых агрегата через `FULL OUTER JOIN` по куке и дню.
В результате полного соединения останутся ключи обеих сторон: при расхождении
на вашей стороне ключа может не быть совсем. Учтите такие строки при сравнении.
Выведите сводку по дням с числом разошедшихся кук и список этих кук
с днем и обоими значениями счета. Общая сумма за день могла бы скрыть
взаимную компенсацию ошибок разных кук. По списку видно, у кого искать причину.
Посчитайте свои сессии по `ClientID` и дню сессии. Соедините результаты двух
расчетов через `FULL OUTER JOIN` по этим полям. Учтите строки, которые есть
только с одной стороны: полное соединение сохранит их в результате.
Выведите сводку по дням с числом `ClientID`, для которых расчеты разошлись,
и список этих идентификаторов с днем и обоими значениями. Общая сумма за день
могла бы скрыть ошибки: для одного посетителя вы посчитали лишнюю сессию,
для другого пропустили. По списку видно, чьи события нужно исследовать.
Расхождений будет всего несколько. Если их нет, мир прожил мало дней.
Прогоните несколько дней через [даги модельного времени](../handbook/airflow-dags.md#даги-мира)
и повторите сверку.
### Расследование
### Поиск причины расхождения
Выберите одну разошедшуюся куку. Выведите ее события за два соседних дня
Выберите один `ClientID` с расхождением. Выведите его события за два соседних дня
с `UTCEventTime`, `EventDate`, `VisitID` и номером своей сессии.
Сопоставьте сессии через события: общего ключа у двух нарезок нет,
Сопоставьте сессии через события: общего ключа у двух расчетов нет,
зато у каждого события есть и `VisitID`, и присвоенный вами номер.
Найдите два соседних события, между которыми границы визитов разошлись.
Запишите куку, день, время обоих событий и причину одним предложением.
Запишите `ClientID`, день, время обоих событий и причину одним предложением.
Уточните определение визита и добейтесь нуля расхождений во всех днях.
## Как проверить себя
## Проверка результата
Сохраните исходный и уточненный расчеты, результаты сверки и найденные строки.
Таблицы и представления создавать не нужно. Задачи в `homework_check`
для этого задания нет: вы проверяете расчет своим запросом.
В `sql/dds/session_rebuild.sql` и
`sql/dq/sessions_vs_reference.sql` лежат готовые запросы нарезки и сверки.
`sql/dq/sessions_vs_reference.sql` лежат готовые запросы расчета сессий и сверки.
Откройте их после собственного решения и расследования. Сравните запросы
со своими.
Сопоставление со стендовой нарезкой по `session_id` остается на ступень 4.
На ступени 4 вы сравните свой результат с готовыми сессиями стенда
по `session_id`.
## Что должно получиться
## Результат работы
- [ ] ваш запрос собирает сессии из всех событий `ods.event_v` за все
доступные дни;
- [ ] у вас есть сводка расхождений по дням и список кук, полученные через
- [ ] у вас есть сводка расхождений по дням и список `ClientID`, полученные через
`FULL OUTER JOIN`;
- [ ] вы объяснили причину одного расхождения и записали куку, день и два
- [ ] вы объяснили причину одного расхождения и записали `ClientID`, день и два
события, на которых оно видно;
- [ ] уточненный расчет дает ноль расхождений во всех днях.