После JOIN таблиц users и events по user_id (связь один-ко-многим) вы хотите получить число пользователей, у которых был хотя бы один ивент. Какой расчёт даст корректное число?

ACOUNT(*) на результате JOIN с GROUP BY user_id для подсчёта уникальных пользователей с событиями
BCOUNT(user_id) после JOIN таблиц users и events с фильтром WHERE event_id IS NOT NULL
CCOUNT(DISTINCT event_id) на результате JOIN таблиц users и events для подсчёта уникальных пользователей
DCOUNT(DISTINCT user_id) на результате JOIN таблиц users и events по user_id для уникальных
Правильный ответ. При связи один-ко-многим в JOIN для подсчёта пользователей нужен COUNT(DISTINCT user_id), иначе вы посчитаете события.

Разбор

Каждый пользователь с несколькими событиями даст несколько строк после JOIN — это размножение строк. COUNT(*) в таком датасете измеряет количество строк, а не количество пользователей. Чтобы считать пользователей, используйте COUNT(DISTINCT user_id) или заранее агрегируйте события до одного флага на user_id.

Проверь себя · 1/3разбор после ответа
Хотите посчитать конверсию «пользователь посмотрел товар → пользователь купил» по user_id. Данные: таблица событий (много просмотров на пользователя) и таблица заказов (много заказов на пользователя). Что корректнее всего сделать, чтобы избежать искажения «многие-ко-многим»?
Открыть Карьерник в Telegram

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