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

AСоединить таблицу событий и таблицу заказов по user_id и посчитать COUNT(*) от полученных строк
BСделать DISTINCT только по таблице событий, а заказы оставить как есть и соединить с просмотрами
CСначала свернуть оба источника до одного флага на пользователя, затем соединить их и считать конверсию
DЗаменить SUM() на AVG() в финальном запросе, чтобы среднее по группам нивелировало размножение строк
Правильный ответ. Для конверсии на уровне пользователя нужно сначала свернуть события и заказы до одного факта на user_id, иначе соединение «многие-ко-многим» создаст дубликаты.

Разбор

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

Проверь себя · 1/3разбор после ответа
Хотите посчитать конверсию «пользователь посмотрел товар → пользователь купил» по user_id. Данные: таблица событий (много просмотров на пользователя) и таблица заказов (много заказов на пользователя). Что корректнее всего сделать, чтобы избежать искажения «многие-ко-многим»?
Открыть Карьерник в Telegram

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