Данные построчно правильные, а итог неверный: ошибки JOIN и гранулярности в аналитике

SiYa_renko 37 минут назад Данные построчно правильные, а итог неверный: ошибки JOIN и гранулярности в аналитике Средний 8 мин 1K Блог компании OTUS SQL * Базы данных * Анализ и проектирование систем * Аналитика Для...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: SiYa_renko 37 минут назад Данные построчно правильные, а итог неверный: ошибки JOIN и гранулярности в аналитике Средний 8 мин 1K Блог компании OTUS SQL * Базы данных * Анализ и проектирование систем * Аналитика Для отчётов интернет‑магазина собирают общую витрину заказов, товарных позиций и платежей. Нужны стоимость заказов, сумма успешных оплат, разрезы по категориям и сегментам клиентов. При первой сверке суммы завышены, хотя число уникальных заказов совпадает с источником.
После исправления JOIN общий итог сходится, но распределение по группам ещё может быть неверным. Возьмём три условных заказа выбранного периода. Платежи считаем по этим заказам, даже если оплата произошла позже.
Технические детали
Заказы и платежи загружены полностью, суммы указаны в рублях, возвратов нет. Неоплаченные заказы сохраняем в отчёте, сегмент клиента определяем на момент заказа. В orders хранится одна строка на заказ, в order_items на товарную позицию, в payments одна актуальная запись на платёж.
У таблиц собственные первичные ключи, суммы не содержат NULL. ЗаказСтоимость, ₽Товарные позиции, ₽Платежи, ₽1011000600 и 400600 и 400, оба успешные102100010001000, неуспешный103600600Нет платежейПо исходным данным ожидаем три заказа общей стоимостью 2600 рублей и успешные платежи на 1000 рублей. Правильные значения участвуют в сумме несколько разГранулярность, или grain, определяет, что представляет одна строка данных.
Заказ и платёж имеют разную гранулярность. Общий order_id позволяет связать записи, но не делает их уровень детализации одинаковым. Первую версию витрины собирают прямым соединением трёх таблиц и считают общие показатели.
Отраслевые последствия
Статус succeeded обозначает успешный платёж. SELECT COUNT(DISTINCT o. order_id) AS orders_count, SUM(o.
order_total) AS orders_total, SUM(p. amount) AS paid_total FROM orders o LEFT JOIN order_items i ON i. order_id LEFT JOIN payments p ON p.
status = 'succeeded';Запрос вернёт три заказа, стоимость 5600 рублей и платежи на 2000 рублей. Для заказа 101 до агрегирования получатся следующие строки. Стоимость заказаСумма позицииСумма платежа1000600600100060040010004006001000400400Каждая позиция соединилась с каждым успешным платежом того же заказа.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





