Привет! Это Вячеслав Потапов, ментор потоков «Аналитика данных» и «BI-аналитика» (кстати, стартуем сегодня!).
Одна из самых частых ошибок начинающих аналитиков — неправильно считать метрики при объединении данных из разных таблиц. Ошибка кажется мелкой, но может полностью сломать выводы и привести к неверным решениям.
Допустим, у вас есть две таблицы:
orders (заказы):
order_id user_id revenue
1 101 1 200
2 102 800
3 101 600
users (пользователи):
user_id city
101 Москва
102 Казань
Задача: посчитать выручку по городам.
Многие начинающие аналитики пишут такой SQL:
select
city,
sum(revenue)
from orders
join users using(user_id);
И вроде работает. Но когда в users появляются дубликаты
user_id (что в реальных данных происходит постоянно), метрика взлетает в 2-3 раза.Почему? Потому что JOIN превращает строки вот во что:
user_id 101 = два дубликата в users Каждая строка в orders умножается ×2, и сумма revenue становится неверной.
Ваш график растёт, менеджер радуется… а потом узнает, что таблица пользователей грязная, и реального роста не было.
Почему так происходит?
Любой JOIN работает как декартово произведение подходящих строк. Если справа две строки на одного user_id, то каждая строка слева размножается. Это не ошибка SQL, это ошибка логики аналитика.
Как правильно? Есть три безопасных паттерна.
1️⃣ Убедиться, что правая таблица уникальна:
select
city,
sum(revenue)
from orders o
join (
select distinct user_id, city from users
) u using(user_id)
group by 1;
2️⃣ Агрегировать users заранее:
select
city,
sum(revenue)
from orders o
left join (
select user_id, max(city) as city
from users
group by user_id
) u using(user_id)
group by city;
3️⃣ Делать агрегацию до JOIN, если возможно:
with revenue_by_user as (
select user_id, sum(revenue) as user_rev
from orders
group by user_id
)
select city, sum(user_rev)
from revenue_by_user r
join users u using(user_id)
group by city;
Вывод:
➖ JOIN'ы редко ломают SQL;
➖ JOIN'ы часто ломают аналитику.
Потому что источник проблемы — дубликаты в данных, о которых джуны обычно не знают или не думают.
Будьте внимательны: неправильная агрегация — это один из главных способов ошибиться на реальных задачах.
📊 Simulative