Зачем: результатом лабораторных должны быть обоснованные решения о подготовке данных для витрин. Что: добавлены проверяемые результаты сверки полноты, выбора ключа, точного разбора и правила пересчета; обновлены программа и индекс, убран подсчет долей потерь. Проверка: SELECT-запросы под analyst, расчеты по сохраненной истории девяти наблюдений, 54 локальные ссылки, git diff --check и независимое техническое ревью.
6.5 KiB
Какая позиция объясняет разницу в сумме
Чему учит: разобрать вложенные данные без потери точности и локализовать расхождение двух источников до товарной позиции.
Факультатив доступен после ступени 1. В DBeaver используйте пользователя
analyst из инструкции подключения.
Дождитесь завершения 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 до копейки? Найдите цены, на которых
результаты различаются, и сверьте наблюдение с
форматом выгрузки. Если все цены
выбранной корзины целые, возьмите еще один заказ с расхождением и дробной ценой.
Какие строки подтверждают найденное расхождение? Есть ли в источниках сведения о том, почему оно возникло? Отделите наблюдения от предположений.
Выберите поля для точного расчета
Укажите рядом с запросом, откуда брать цену, каким типом ее читать и по какому ключу сопоставлять позиции. Подтвердите выбор результатами обеих сверок: суммы разобранных позиций с суммой своего источника и позиций двух источников между собой. Какой результат укажет на ошибку вашего разбора, а какой потребует искать причину выше — в данных, которые получил запрос?
Что должно получиться
- сохранен запрос сверки позиций, не теряющий товары без пары;
- все три равенства сходятся до копейки;
- найден пример потери точности в готовом массиве цен;
- выбор полей, типа денег и ключа сопоставления подтвержден расчетами;
- расхождение источников сверки отделено от ошибки своего разбора и различия между стоимостью корзины и итогом со скидкой и доставкой.