Нужен датасет на уровне user_id: выручка из orders и число сессий из sessions. В обеих таблицах по пользователю много строк (one-to-many). Какой подход минимизирует риск join explosion?
AСделать
JOIN orders и sessions по user_id, а затем посчитать SUM() и COUNT(*)BСделать
JOIN, а потом применить distinct ко всем колонкамCУдалить все строки кроме первой в
orders, чтобы стало one-to-oneDСначала
pre-aggregate orders до 1 строки на user_id и отдельно pre-aggregate sessions, затем соединить агрегатыПравильный ответ. Для метрик на уровне пользователя сначала делают
pre-aggregate источников до нужной cardinality, и только потом соединяют.Разбор
Если соединить «сырые» orders и sessions, получится many-to-many по user_id и вы получите duplication строк. В результате денежные и счётные метрики будут завышены. Предварительная агрегация до одной строки на пользователя сохраняет правильный уровень данных и делает соединение ближе к one-to-one.
Проверь себя · 1/3разбор после ответа
В
orders 120 строк (по одной на order_id). В order_items ровно по 3 строки на каждый order_id. Сколько строк будет после соединения orders → order_items по order_id и почему?Ещё вопросы по теме «JOIN и кардинальность»
- В таблице `users` 100 000 строк, в таблице `user_profiles` — ровно одна строка на каждого `user_id`. Вы делаете `INNER JOIN` по `user_id`. Что верно про число строк результата?
- Вы соединяете `users` и `orders` по `user_id`, где у пользователя может быть много заказов (`one-to-many`). Как посчитать число пользователей, которые сделали хотя бы один заказ, чтобы избежать `duplication`?
- Для одного `order_id` в `order_items` есть 3 строки, а в `payments` есть 2 строки. Вы соединили всё в одну таблицу по `order_id` без предварительной агрегации. Сколько строк получится для этого заказа и почему?
- Вы хотели посчитать средний чек по заказам как `AVG(order_total)`. Но перед этим соединили `orders` с `order_items` по `order_id` (`one-to-many`). Почему `AVG()` может измениться по сравнению с расчётом на таблице `orders`?
- В каком случае `SUM(order_amount)` после `JOIN` скорее всего останется корректным, без эффекта `duplication`?
- Все вопросы по «JOIN и кардинальность» →