Вы соединили users и orders (one-to-many) и посчитали AVG(order_amount), интерпретируя это как «средняя выручка на пользователя». Почему это неверно и как правильно?

AНеверно, потому что AVG() считает только целые числа; правильно использовать SUM()
BВерно: AVG(order_amount) всегда равно выручке на пользователя
CНеверно, потому что INNER JOIN удаляет пользователей; нужно LEFT JOIN и тогда всё станет правильно
DНеверно, потому что AVG() считает среднее по заказам, а не по пользователям; нужно сначала pre-aggregate выручку до user_id, а затем взять AVG() по пользователям
Правильный ответ. В one-to-many JOIN AVG() по полю заказа даёт среднее по заказам, а не по пользователям из-за разного cardinality.

Разбор

Пользователь с 10 заказами будет «весить» в среднем в 10 раз больше пользователя с одним заказом, поэтому получается среднее по строкам заказов. Если цель — метрика на пользователя, сначала посчитайте выручку на user_id через SUM() по заказам, а уже потом усредняйте. Это базовое правило выбора уровня агрегации перед и после JOIN.

Проверь себя · 1/3разбор после ответа
В events(user_id, event_id) у пользователя может быть много строк, и в orders(user_id, order_id) тоже много строк. Вы соединяете их по user_id. Какая cardinality получается на ключе и как это влияет на строки?
Открыть Карьерник в Telegram

Ещё вопросы по теме «JOIN и кардинальность»