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

AДедуплицировать на уровне user_id: использовать COUNT(DISTINCT users.user_id) или предварительно агрегировать events до набора user_id
BЗаменить JOIN на UNION между таблицами: пересечение строк исчезнет и счётчик перестанет завышать аудиторию кампании
CОставить COUNT(users.user_id) и поделить на среднее число events на пользователя для компенсации размножения строк
DСчитать COUNT(DISTINCT event_id) по таблице events как число уникальных пользователей в данной кампании
Правильный ответ. После JOIN один user_id может повториться много раз, поэтому для уникальных пользователей нужна дедупликация через DISTINCT.

Разбор

Когда вы присоединяете events к users, каждая строка events размножает строку user_id. Счётчик без дедупликации превращается в счётчик событий, а не аудитории. Правильная проверка адекватности — убедиться, что вы считаете размер набора user_id, например через COUNT(DISTINCT user_id). Замена на UNION не решает задачу подсчёта уникальных пользователей в одной кампании; деление на среднее — эвристика без гарантий; а COUNT(DISTINCT event_id) считает события, а не пользователей.

Проверь себя · 1/3разбор после ответа
Аналитик сложил DAU за 30 дней и получил 3 млн, а MAU за тот же месяц равен 400 тыс уникальных пользователей. Почему это может быть нормально?
Открыть Карьерник в Telegram

Ещё вопросы по теме «Теория множеств и дедупликация»