← Назад к вопросам
Как посчитать уникальных пользователей БД, если пользователь появляется несколько раз?
2.0 Middle🔥 201 комментариев
#Базы данных и SQL
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Подсчёт уникальных пользователей в БД
Это классическая задача аналитики, которая решается несколькими способами в зависимости от контекста. Расскажу о наиболее эффективных подходах.
Способ 1: SQL с DISTINCT (самый простой)
SELECT COUNT(DISTINCT user_id) AS unique_users_count
FROM users_table;
Это работает когда:
- Таблица содержит одну запись на пользователя (даже если пользователь встречается в разных таблицах)
- Нужно просто узнать количество уникальных пользователей
Способ 2: Если пользователь дублируется в одной таблице
Например, если таблица содержит логи действий и один пользователь может иметь несколько записей:
SELECT COUNT(DISTINCT user_id) AS unique_users
FROM user_actions;
Ключевое слово DISTINCT удаляет дубликаты перед подсчётом.
Способ 3: Если нужно совместить данные из нескольких таблиц
SELECT COUNT(DISTINCT u.user_id) AS unique_users
FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.user_id
);
Этот вариант считает только пользователей, которые совершили хотя бы один заказ.
Способ 4: С использованием CTE для больших таблиц
WITH unique_users AS (
SELECT DISTINCT user_id
FROM transactions
)
SELECT COUNT(*) AS unique_users_count
FROM unique_users;
Этот подход более читаем для сложных логик и может быть быстрее на больших объёмах данных.
Способ 5: Для временного анализа (за период)
SELECT
DATE_TRUNC(month, created_at) AS month,
COUNT(DISTINCT user_id) AS monthly_unique_users
FROM events
GROUP BY DATE_TRUNC(month, created_at)
ORDER BY month DESC;
Важные нюансы
Производительность
- На больших таблицах (> 100M строк) COUNT(DISTINCT) может быть медленным
- В таких случаях используют аппроксимацию (HyperLogLog, т.е. SQL функция
APPROX_COUNT_DISTINCTв BigQuery или Snowflake)
NULL значения
- COUNT(DISTINCT) игнорирует NULL
- Если нужно считать NULL как отдельное значение, используй:
COUNT(DISTINCT COALESCE(user_id, NULL))
Индексы
- Для оптимизации используй индекс на
user_id - COUNT(DISTINCT) работает намного быстрее если столбец индексирован
Мой рекомендуемый подход
В 90% случаев используй COUNT(DISTINCT user_id) — это просто, понятно и достаточно быстро.
Для аналитики больших данных переходи на аппроксимацию или специализированные инструменты (BigQuery, ClickHouse).