Хотите посчитать конверсию «пользователь посмотрел товар → пользователь купил» по user_id. Данные: events (много просмотров на пользователя) и orders (много заказов на пользователя). Что корректнее всего сделать, чтобы избежать many-to-many искажения?

AСоединить events и orders по user_id и посчитать COUNT(*)
BСделать distinct только по events, а orders оставить как есть
CСначала pre-aggregate оба источника до одного флага на user_id, затем соединить и считать конверсию
DЗаменить SUM() на AVG()
Правильный ответ. Для конверсии на уровне пользователя нужно pre-aggregate события и заказы до user_id, иначе many-to-many создаст duplication.

Разбор

Если соединить сырые события и заказы, пользователь с 10 просмотрами и 2 заказами даст 20 строк — это join explosion. Тогда и числитель, и знаменатель могут стать бессмысленными, а эффект — искусственным. Превратите каждый источник в один факт на пользователя, и только затем считайте конверсию.

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

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