Нужен набор данных на уровне 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 поверх раздутого результата не восстанавливает корректные суммы, а удаление лишних строк искажает данные.

Можно заниматься бесплатно

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

Открыть Карьерник в браузере

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