# Почему повтор покупки завышает выручку Несколько событий покупки могут относиться к одному заказу. Вы проверите, как они завышают сумму, и составите расчет, который учитывает каждый заказ один раз. Факультатив доступен после ступени 1. Работайте в DBeaver пользователем `analyst` по [инструкции](../../../README.md#подключиться-из-dbeaver). Дождитесь завершения `etl_pipeline`; оставьте `world_live` на паузе и дождитесь уже начатых прогонов, чтобы данные не менялись между запросами. ## Расчет по событиям покупки В ODS уже устранены повторные доставки событий. Достаточно ли этого, чтобы сложить суммы всех `purchase` для витрины заказов? Проверьте на данных. Возьмите день, за который уже получены все слепки заказов: его дата должна быть не позднее `max(snapshot_date) - 6` из `ods.order_v`. Во всех запросах к `dds.event_v` отбирайте этот `event_date` и `event_type = 'purchase'`. Номер заказа находится в `purchase_id[1]`, заявленная сумма — в `purchase_revenue[1]`. По формату источника у события покупки один номер заказа. Сначала посчитайте число событий и сумму всех заявленных сумм. Затем найдите номера заказов, которые встречаются несколько раз. Если таких нет, выберите другой день с полученными слепками. Для двух повторившихся покупок выпишите `event_id`, `client_id`, `event_time`, номер заказа и сумму. Сопоставьте число событий и заказов в `dds.order_v`. ## Расчет по заказам Напишите запрос с одной строкой на номер заказа. Сохраните в результате номер, число исходных событий и одну заявленную сумму. До выбора суммы проверьте, что во всех событиях заказа она одинакова. Затем посчитайте итог дня по результату этого запроса и сравните с расчетом по событиям. Проверьте, что номера в результате уникальны, а число строк совпадает с числом разных номеров в исходных событиях. Отдельно проверьте свое решение на случае двух разных заказов с одинаковой суммой: сколько денег оно учтет? ## Заказы с повторными событиями Возьмите один повторившийся номер заказа. Сколько денег он добавил в первый расчет и сколько — во второй? Подтвердите разность его событиями. Повторите расчет для остальных повторившихся номеров. Сохраните таблицу: номер заказа, число событий и вклад в разность сумм. Проверьте, объясняют ли эти заказы все расхождение за день до копейки. Слой ODS убирает повторную доставку одного события по его идентификатору; `dds.event_v` читает уже это состояние. Сравните число разных `event_id` и число разных номеров заказа в выбранных строках. Почему устранение повторов по первому ключу не дало тот же результат, что по второму? Подтвердите ответ конкретными идентификаторами. После собственного расчета найдите эти заказы в `dm.purchase_vs_orders_v`. Если у повторившегося заказа класс отличается от `duplicate_event`, проверьте его статус и [порядок присвоения классов](../../architecture/dm.md#dmpurchase_vs_orders_v). Класс витрины не заменяет поиск всех повторов в событиях. ## Сравнение с выручкой магазина Сложите `revenue` из `dm.revenue_daily_v` за тот же `report_date` по всем категориям. Эта витрина считает стоимость позиций оплаченных заказов, без скидки и доставки. Сравните результат с суммой по событиям после устранения повторов. Совпадение не требуется: удаление повторов устраняет одну причину расхождения. Найдите хотя бы один заказ, который объясняет, почему деньги трекера и магазина все еще могут различаться. Для этого сопоставьте события, заказ и готовую сверку. Рядом с запросом укажите, чему соответствует одна строка результата и какие поля ее определяют. Обоснуйте, где нужна одна строка на событие, а где одна на заказ: следует ли ради этого расчета удалять повторные покупки из `dds.event_v`? Используйте найденные `event_id`. ## Результат работы - [ ] сохранен запрос с одной строкой на заказ, числом событий и суммой; - [ ] уникальность ключа и полнота набора номеров проверены по источнику; - [ ] разность сумм полностью объяснена вкладом лишних событий; - [ ] обоснованы ключ расчета и место устранения повторов; - [ ] найден случай, показывающий границы расчета денег по трекеру.