Вы хотели посчитать средний чек по заказам как AVG(order_total). Но перед этим соединили orders с order_items по order_id (one-to-many). Почему AVG() может измениться по сравнению с расчётом на таблице orders?
AПоявилась
duplication: каждый order_total повторился по числу строк в order_items, и AVG() стал взвешен по количеству позицийB
AVG() всегда игнорирует строки после JOINCПотому что
one-to-one cardinality делает среднее вышеDПотому что
distinct автоматически удаляет большие чекиПравильный ответ. После
one-to-many JOIN AVG() по полю заказа становится взвешенным из-за duplication строк.Разбор
В исходной таблице orders один заказ равен одной строке, поэтому AVG(order_total) — простой средний чек по заказам. После JOIN каждый заказ повторяется столько раз, сколько у него позиций, и влияет на среднее несколько раз. Чтобы избежать искажения, считайте AVG() на уровне заказа или pre-aggregate до order_id перед соединением.
Проверь себя · 1/3разбор после ответа
Для одного
order_id в order_items есть 3 строки, а в payments есть 2 строки. Вы соединили всё в одну таблицу по order_id без предварительной агрегации. Сколько строк получится для этого заказа и почему?Ещё вопросы по теме «JOIN и кардинальность»
- В таблице `users` 100 000 строк, в таблице `user_profiles` — ровно одна строка на каждого `user_id`. Вы делаете `INNER JOIN` по `user_id`. Что верно про число строк результата?
- Вы соединяете `users` и `orders` по `user_id`, где у пользователя может быть много заказов (`one-to-many`). Как посчитать число пользователей, которые сделали хотя бы один заказ, чтобы избежать `duplication`?
- Для одного `order_id` в `order_items` есть 3 строки, а в `payments` есть 2 строки. Вы соединили всё в одну таблицу по `order_id` без предварительной агрегации. Сколько строк получится для этого заказа и почему?
- Нужен датасет на уровне `user_id`: выручка из `orders` и число сессий из `sessions`. В обеих таблицах по пользователю много строк (`one-to-many`). Какой подход минимизирует риск `join explosion`?
- В каком случае `SUM(order_amount)` после `JOIN` скорее всего останется корректным, без эффекта `duplication`?
- Все вопросы по «JOIN и кардинальность» →