Нужно посчитать количество уникальных пользователей, которые совершили событие либо в events_web(user_id), либо в events_app(user_id). Какой запрос посчитает корректно, если один и тот же пользователь мог быть в обоих источниках?

ASELECT COUNT(*) FROM (SELECT user_id FROM events_web UNION ALL SELECT user_id FROM events_app) t
BSELECT COUNT(*) FROM (SELECT user_id FROM events_web UNION SELECT user_id FROM events_app) t
CSELECT COUNT(*) FROM events_web w INNER JOIN events_app a ON w.user_id = a.user_id
DSELECT COUNT(*) FROM (SELECT user_id FROM events_web INTERSECT SELECT user_id FROM events_app) t
Правильный ответ. UNION объединяет наборы и сразу убирает дубли — это даёт количество уникальных пользователей хотя бы в одном источнике.

Разбор

Если использовать объединение со всеми повторами (UNION ALL), пользователь, встретившийся в обоих источниках, попадёт в результат дважды и будет посчитан два раза. UNION возвращает объединение множеств без дублей, поэтому COUNT(*) по результату даст количество уникальных пользователей, которые были хотя бы в одном источнике. INTERSECT посчитает только тех, кто был в обоих, а INNER JOIN — пары совпадений, что не равно искомому числу.

Проверь себя · 1/3разбор после ответа
Без оконных функций нужно для каждого дня посчитать изменение выручки по сравнению с предыдущим днём. Таблица daily_revenue содержит date и revenue. Как это сделать?
Тренировать SQL в Telegram

Ещё вопросы по теме «JOIN и операции множеств»