- Зачем: начинающим трудно читать задания из-за необъясненных терминов и неестественных формулировок. - Что: переработаны вводная и 21 задание, названы темы разделов, объяснены термины и сокращены повторы; согласованы правила учебного текста и ссылки. - Проверка: сохранены 25 блоков SQL и команд и таблицы состава колонок; проверены 153 локальные ссылки и 32 входящие ссылки на разделы; git diff --check прошел.
86 lines
6.5 KiB
Markdown
86 lines
6.5 KiB
Markdown
# Какая позиция объясняет разницу в сумме
|
||
|
||
Вы сравните товары в событии покупки и заказе магазина, чтобы найти причину
|
||
разницы в суммах. При разборе вложенных данных понадобится сохранить точность
|
||
цен до копейки.
|
||
|
||
Факультатив доступен после ступени 1. В DBeaver используйте пользователя
|
||
`analyst` из [инструкции подключения](../../../README.md#подключиться-из-dbeaver).
|
||
Дождитесь завершения `etl_pipeline`; оставьте `world_live` на паузе и
|
||
дождитесь уже начатых прогонов.
|
||
|
||
## Выбор заказа
|
||
|
||
Суммы покупки в трекере и заказа в магазине различаются. Разберите их позиции
|
||
и проверьте отдельно точность своего запроса и различия между событием и заказом.
|
||
|
||
В `dm.purchase_vs_orders_v` выберите один заказ с
|
||
`mismatch_class = 'amount_delta'`. Возьмите закрытый день: `order_day`
|
||
не позднее `max(snapshot_date) - 6` из `ods.order_v`. Сохраните `order_id`,
|
||
`order_day`, `declared_revenue` и `items_total`.
|
||
|
||
Найдите этот заказ в `dds.order_v`. Сопоставьте `items_total`, `discount`,
|
||
`delivery` и `total`. Запишите равенство, связывающее эти четыре значения,
|
||
и проверьте его на заказе. С какой суммой магазина следует сравнивать
|
||
`declared_revenue`, если мы ищем расхождение именно в составе корзины?
|
||
Проверьте свой выбор после разбора позиций.
|
||
|
||
## Товарные позиции события и заказа
|
||
|
||
Найдите событие покупки в `ods.event_v`: `purchaseID[1]` совпадает с номером
|
||
заказа, `EventDate` — с выбранным днем, `EventType = 'purchase'`.
|
||
Откройте поле `ecommerce`. Внутри JSON массив `purchase.products` содержит
|
||
товары из события покупки с полями `id`, `price` и `quantity`.
|
||
|
||
Разверните этот массив в строки и получите артикул, точную цену, количество
|
||
и стоимость каждой позиции. Для разбора пригодятся `JSONExtractArrayRaw`
|
||
и `JSONExtract`, для разворачивания массива — `ARRAY JOIN`.
|
||
Деньги извлекайте как `Decimal` с двумя знаками после запятой.
|
||
|
||
С другой стороны используйте массивы `item_sku`, `item_price` и
|
||
`item_quantity` заказа в `dds.order_v`. Элементы с одним индексом относятся
|
||
к одной позиции; при разворачивании сохраняйте эту связь.
|
||
|
||
Сопоставьте позиции по артикулу так, чтобы остались видны товары,
|
||
присутствующие только с одной стороны. Для каждой позиции сравните наличие,
|
||
цену и количество. Что различается и сколько это добавляет к расхождению
|
||
сумм?
|
||
Сохраните запрос сверки для выбранных даты и номера заказа; в результате
|
||
оставьте артикул, значения с обеих сторон и разность стоимостей позиций.
|
||
|
||
## Проверка сумм
|
||
|
||
Подтвердите три равенства:
|
||
|
||
- сумма стоимостей клиентских позиций равна `declared_revenue`;
|
||
- сумма стоимостей позиций магазина равна `items_total`;
|
||
- сумма расхождений по позициям равна
|
||
`declared_revenue - items_total`.
|
||
|
||
Затем сравните точные цены из JSON с готовым массивом `productPrice`
|
||
события. Пересчитайте стоимость клиентской корзины по этому массиву:
|
||
сойдется ли она с `declared_revenue` до копейки? Найдите цены, на которых
|
||
результаты различаются, и сверьте наблюдение с
|
||
[форматом выгрузки](../../formats/clickstream-event.md). Если все цены
|
||
выбранной корзины целые, возьмите еще один заказ с расхождением и дробной ценой.
|
||
|
||
Какие строки подтверждают найденное расхождение? Есть ли в источниках
|
||
сведения о том, почему оно возникло? Отделите наблюдения от предположений.
|
||
|
||
## Поля для точного расчета
|
||
|
||
Укажите рядом с запросом, откуда брать цену, каким типом ее читать и по какому
|
||
ключу сопоставлять позиции. Подтвердите выбор результатами обеих сверок:
|
||
суммы разобранных позиций с суммой своего источника и позиций двух источников
|
||
между собой. Какой результат укажет на ошибку вашего разбора, а какой
|
||
потребует искать причину выше — в данных, которые получил запрос?
|
||
|
||
## Результат работы
|
||
|
||
- [ ] сохранен запрос сверки позиций, не теряющий товары без пары;
|
||
- [ ] все три равенства сходятся до копейки;
|
||
- [ ] найден пример потери точности в готовом массиве цен;
|
||
- [ ] выбор полей, типа денег и ключа сопоставления подтвержден расчетами;
|
||
- [ ] расхождение источников сверки отделено от ошибки своего разбора и различия
|
||
между стоимостью корзины и итогом со скидкой и доставкой.
|