docs(labs): упрощен язык учебных заданий
- Зачем: начинающим трудно читать задания из-за необъясненных терминов и неестественных формулировок. - Что: переработаны вводная и 21 задание, названы темы разделов, объяснены термины и сокращены повторы; согласованы правила учебного текста и ссылки. - Проверка: сохранены 25 блоков SQL и команд и таблицы состава колонок; проверены 153 локальные ссылки и 32 входящие ссылки на разделы; git diff --check прошел.
This commit is contained in:
1 parent
3c3eb825e1
commit
4693bc5af9
24 files changed
+782
-684
No files matched your search
@@ -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`, день и два
|
||||
события, на которых оно видно;
|
||||
- [ ] уточненный расчет дает ноль расхождений во всех днях.
|
||||
Reference in new issue
Block a user