Вы сделали LEFT JOIN usersevents по user_id, чтобы сохранить пользователей без событий. Как корректно посчитать количество пользователей на соединённой таблице, не попавшись в ловушку дублирования строк?

AИспользовать COUNT(DISTINCT user_id), чтобы получить число уникальных пользователей и не дублировать их по числу совпавших событий.
BИспользовать COUNT(*), считая, что после LEFT JOIN число строк автоматически равно числу пользователей в исходной таблице слева.
CИспользовать COUNT(event_id), считая, что строки с NULL справа всё равно учтутся в счётчике пользователей без событий.
DИспользовать SUM(event_id), считая, что сумма идентификаторов корректно отражает количество уникальных пользователей в результате.
Правильный ответ. После LEFT JOIN к таблице с отношением «один-ко-многим» пользователи дублируются, поэтому для подсчёта пользователей нужен COUNT(DISTINCT user_id).

Разбор

LEFT JOIN сохраняет всех пользователей, но добавляет по строке на каждое совпавшее событие, создавая дубли. COUNT(*) в таком наборе ближе к числу событий, а COUNT(event_id) игнорирует строки без событий, где справа NULL. COUNT(DISTINCT user_id) возвращает число уникальных пользователей, включая тех, у кого нет ни одного события. Это и есть корректный ответ для метрики числа пользователей.

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

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