TGViewer
Симулейтив Симулейтив @simulative_official · 7.46K subscribers
Post #3057 1.32K
Почему LEFT JOIN внезапно превращается в INNER JOIN?

Привет! На связи Вячеслав Потапов, ментор курса «Аналитик данных» 👋

Сегодня решил дать вам разбор ошибок, которые можно часто допускать в начале карьеры: почему LEFT JOIN внезапно превращается в INNER JOIN?

Это важно, если вы считаете конверсии, retention, воронки и пользователей без действий (0 заказов, 0 оплат и т. д.).

Задача: есть таблицы:

🟠 users: user_id, registration_date;
🟠 orders: order_id, user_id, order_date.

Хотим посчитать количество заказов на каждого пользователя после 1 января 2025 года, включая тех, у кого 0 заказов. Как это можно сделать?

select
u.user_id,
count(o.order_id) as orders_cnt
from users u
left join orders o
on u.user_id = o.user_id
where o.order_date >= '2025-01-01'
group by u.user_id;


На вид всё логично, но пользователи без заказов пропадают. Почему так происходит?

LEFT JOIN сохраняет всех пользователей, WHERE o.order_date >= ... выполняется после JOIN. Для пользователей без заказов:
➖ o.order_date = NULL;
➖ Условие NULL >= '2025-01-01' даёт NULL;
➖ А WHERE оставляет только TRUE.

В результате LEFT JOIN превращается в INNER JOIN, и часть данных исчезает. Как правильно?

Способ 1 (самый правильный) — условие переносим в JOIN:

select
u.user_id,
count(o.order_id) as orders_cnt
from users u
left join orders o
on u.user_id = o.user_id
and o.order_date >= '2025-01-01'
group by u.user_id;


Теперь пользователи без заказов останутся и count(o.order_id) даст 0.

Способ 2 (на больших данных самый надёжный) — агрегируем до JOIN:

with orders_cnt as (
select
user_id,
count(*) as cnt
from orders
where order_date >= '2025-01-01'
group by user_id
)
select
u.user_id,
coalesce(o.cnt, 0) as orders_cnt
from users u
left join orders_cnt o
on u.user_id = o.user_id;


Запомните правило: WHERE на правой таблице после LEFT JOIN — это опасно. Проверяйте логику — через фильтры для правой таблицы в ON либо через предварительную агрегацию.

Ставьте реакции, если было полезно!

📊 Simulative
  • 🔥 46
  • 👍 9
  • ❤ 7
More from @simulative_official
  1. Oct 2, 2026🐍 Библиотека Pandas для анализа данных Pandas — это мощный инструмент для анализа данных,…
  2. Oct 1, 2026Post #3592
  3. Sep 30, 2026💻💻💻💻💻 Откуда на самом деле берутся данные? На учебных задачах всё просто: тебе дают г…
  4. Sep 30, 2026⭐️ Топ метрик, которые должен уметь считать каждый аналитик Рекламные метрики — это не про…
  5. Sep 29, 2026⭐️ Уже сегодня: как ML-инженер учит компьютер находить смысл в тексте Сегодня покажем проф…
  6. Sep 28, 2026#проанализировали_и_поняли
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →