Нужен набор данных на уровне user_id: выручка из orders и число сессий из sessions. В обеих таблицах по пользователю много строк (один-ко-многим). Какой подход минимизирует риск размножения строк в соединении?

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

Разбор

Если соединить «сырые» orders и sessions, получится связь многие-ко-многим по user_id, и строки будут размножаться. В результате денежные и счётные метрики будут завышены. Предварительная агрегация до одной строки на пользователя сохраняет правильный уровень данных и делает соединение ближе к один-к-одному. DISTINCT поверх раздутого результата не восстанавливает корректные суммы, а удаление лишних строк искажает данные.

Проверь себя · 1/3разбор после ответа
После JOIN таблиц users и events по user_id (связь один-ко-многим) вы хотите получить число пользователей, у которых был хотя бы один ивент. Какой расчёт даст корректное число?
Открыть Карьерник в Telegram

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