Зафиксируйте смысл одной строки
Зерно витрины определяет, чему соответствует одна строка. В нашем примере это один магазин за один календарный день оплаты. Ключ состоит из даты и идентификатора магазина. Показатели: число оплаченных заказов и сумма их оплаты. Договоритесь о часовом поясе, единой валюте и правилах учёта отмен. Для учебного примера используйте заказы без возвратов. В рабочей задаче возвратам потребуется отдельное правило. Источник должен содержать одну строку на заказ. Если в нём лежат товарные позиции или несколько платежей, сначала приведите данные к нужному уровню.
Соберите показатели без размножения строк
Сначала отберите нужный период и оплаченные заказы. Затем сгруппируйте строки по дате и магазину с помощью GROUP BY. На уровне заказов COUNT считает их количество, а SUM складывает суммы. Проверьте значения до и после соединения со справочником магазинов. Если одному идентификатору соответствуют две строки справочника, каждый заказ может попасть в результат дважды. Итоговая выручка вырастет без новых продаж. Не исправляйте это случайным удалением одинаковых сумм: разные заказы могут иметь одинаковую стоимость. Исправьте ключ соединения или обеспечьте единственность подходящей строки справочника.
Сделайте повторный запуск безопасным
Идемпотентное обновление при одинаковых входных данных даёт одинаковое состояние витрины после любого числа повторов. Передавайте расчётную дату явно: повтор вчерашней задачи завтра должен пересчитать вчерашний день. Простое добавление рассчитанных строк создаёт дубликаты. Для небольшой дневной витрины можно полностью заменять данные выбранной даты. В базе с поддержкой транзакций удаление старого результата и запись нового выполняют в одной транзакции, чтобы читатели не увидели промежуточную пустую таблицу. Не допускайте одновременных обновлений одной даты. Расписание запуска должно учитывать завершение загрузки источника.
Учтите опоздания и проверки
Заказ может попасть в источник позже дня оплаты. Поэтому расчёт только предыдущего дня способен пропустить продажу. Задайте окно пересчёта по реальным задержкам источника, например несколько последних дней. Для более старых исправлений предусмотрите отдельный запуск по диапазону дат. Перед публикацией проверяйте уникальность ключа, отсутствие пустых дат и идентификаторов, количество заказов и сверку сумм с источником при тех же фильтрах. Записывайте расчётную дату, время обновления и результат проверок. Технически успешный запрос ещё не подтверждает полноту данных: отсутствие строк может означать как отсутствие продаж, так и сбой загрузки.
Попробуйте на практике
Проверьте проект витрины на маленьком наборе вымышленных заказов, прежде чем подключать расписание.
- Подготовьте шесть оплаченных заказов для двух магазинов за два дня. У каждого должны быть уникальный идентификатор, дата оплаты, магазин и сумма.
- Вручную посчитайте ожидаемые итоги по каждой паре даты и магазина. Выполните группировку и сравните все строки с этим образцом.
- Добавьте вторую строку одного магазина в справочник. Проверьте, обнаруживает ли контроль соединения увеличение числа заказов и суммы.
- Выполните обновление одной даты дважды на неизменном источнике. Затем добавьте опоздавший заказ за эту дату и пересчитайте её снова.
Как проверить результат. После одинаковых повторов строки и суммы должны совпасть. После добавления опоздавшего заказа меняется только соответствующая группа: количество увеличивается на один, сумма на стоимость заказа. Дубликатов ключа быть не должно.
Частые вопросы
Можно ли всегда пересчитывать всю историю?
При небольшом объёме это может быть простым решением. С ростом данных оценивайте длительность и нагрузку, сохраняя возможность точечного пересчёта старых дат.
Достаточно ли проверить только общую сумму?
Нет. Ошибки разных магазинов способны взаимно компенсироваться. Сверяйте показатели по ключам витрины и отдельно проверяйте количество исходных заказов.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.