Зачем: учащемуся нужен понятный путь от наблюдений к выводу без готового ответа в задании. Что: уточнены сравнения в четырех расследованиях; готовые объяснения заменены вопросами к строкам, расчетам и сохраненным состояниям. Проверка: проверены 54 локальные ссылки и git diff --check; формулировки сверены с устройством источников и витрин.
72 lines
5.2 KiB
Markdown
72 lines
5.2 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). Если все цены
|
||
выбранной корзины целые, возьмите еще один заказ с расхождением и дробной ценой.
|
||
|
||
В коротком объяснении назовите заказ, товар, количество, цену и разницу.
|
||
Какие строки подтверждают найденное расхождение? Есть ли в источниках
|
||
сведения о том, почему оно возникло? Отделите наблюдения от предположений.
|
||
|
||
## Что должно получиться
|
||
|
||
- [ ] позиции клиента и магазина сопоставлены по артикулам;
|
||
- [ ] все три равенства сходятся до копейки;
|
||
- [ ] найден пример потери точности в готовом массиве цен;
|
||
- [ ] расхождение объяснено конкретной позицией, а скидка и доставка
|
||
отделены от сравнения корзин.
|