← Назад к вопросам

Как посчитать уникальных пользователей БД, если пользователь появляется несколько раз?

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).