Подсчёт уникальных значений
Практическое применение COUNT(DISTINCT ...)
«Подсчёт уникальных значений» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Зачем подсчитывать уникальные значения
При использовании COUNT(*) подсчитывается каждая строка, включая дубликаты. Но иногда нужно узнать только, сколько уникальных значений содержится в столбце.
Например: из скольких разных стран происходят Ваши клиенты? Сколько уникальных товаров было заказано в прошлом месяце? Здесь и пригодится COUNT(DISTINCT ...).
Создание таблицы для примера
Создадим таблицу заказов для практики. В каждом заказе указаны имя клиента, товар и страна.
Обратите внимание: некоторые клиенты и страны встречаются больше одного раза — это сделано намеренно, чтобы мы могли увидеть разницу между подсчётом всех строк и подсчётом уникальных значений.
CREATE TABLE orders (
id INT,
customer VARCHAR(50),
product VARCHAR(50),
country VARCHAR(50)
);
INSERT INTO orders VALUES
(1, 'Alice', 'Laptop', 'USA'),
(2, 'Bob', 'Phone', 'UK'),
(3, 'Alice', 'Tablet', 'USA'),
(4, 'Carol', 'Laptop', 'Canada'),
(5, 'Bob', 'Laptop', 'UK'),
(6, 'Dave', 'Phone', 'USA'),
(7, 'Carol', 'Phone', 'Canada'),
(8, 'Eve', 'Tablet', 'Germany');COUNT(*) и COUNT(DISTINCT)
Выполните оба запроса и сравните результаты. COUNT(*) возвращает 8 — по одному значению для каждой строки. COUNT(DISTINCT клиент) возвращает 5, потому что всего 5 уникальных клиентов (Алиса, Боб, Кэрол, Дэйв и Ив).
В этом и состоит основная идея: COUNT(DISTINCT column) игнорирует повторяющиеся значения и подсчитывает только уникальные.
SELECT COUNT(*) AS total_orders,
COUNT(DISTINCT customer) AS unique_customers
FROM orders;Подсчёт уникальных стран
Узнаем, из скольких разных стран происходят наши клиенты. Хотя в таблице заказов 8 строк, несколько строк относятся к одной и той же стране.
Результат будет равен 4 — USA, UK, Канада и Германия, независимо от того, сколько раз встречается каждая страна.
SELECT COUNT(DISTINCT country) AS unique_countries
FROM orders;Подсчёт уникальных товаров
Тот же приём можно применить к любому столбцу. Здесь мы подсчитаем, сколько разных товаров было заказано.
Хотя «Ноутбук» встречается три раза, а «Телефон» — три раза, каждый товар подсчитывается только один раз. Ответ: 3 — Ноутбук, Телефон и Планшет.
SELECT COUNT(DISTINCT product) AS unique_products
FROM orders;Использование COUNT(DISTINCT) с WHERE
Можно сочетать COUNT(DISTINCT ...) с предложением WHERE, чтобы сузить набор строк перед подсчётом. Здесь мы подсчитываем уникальные товары, заказанные только клиентами из USA.
Учитываются только строки, в которых страна = 'USA', после чего среди этих строк подсчитываются уникальные товары.
SELECT COUNT(DISTINCT product) AS usa_unique_products
FROM orders
WHERE country = 'USA';COUNT(DISTINCT) с GROUP BY
В сочетании с GROUP BY функция COUNT(DISTINCT ...) возвращает количество уникальных значений для каждой группы. Этот запрос отвечает на вопрос: сколько уникальных клиентов оформило заказы в каждой стране?
Каждая группа обрабатывается независимо, поэтому дубликаты внутри группы удаляются до подсчёта.
SELECT country,
COUNT(DISTINCT customer) AS unique_customers
FROM orders
GROUP BY country
ORDER BY unique_customers DESC;Подсчёт уникальных значений в нескольких столбцах
В одном SELECT можно использовать несколько выражений COUNT(DISTINCT ...). Это позволяет быстро получить обзор кардинальности — узнать, сколько уникальных значений содержится в каждом столбце, — одним запросом.
Кардинальность — полезная метрика при исследовании нового набора данных.
SELECT COUNT(DISTINCT customer) AS unique_customers,
COUNT(DISTINCT product) AS unique_products,
COUNT(DISTINCT country) AS unique_countries
FROM orders;Как обрабатывается NULL
Так же, как обычный COUNT(column), функция COUNT(DISTINCT column) игнорирует значения NULL. NULL не подсчитывается как уникальное значение.
В этом примере в двух строках указано NULL в качестве страны. Результат по-прежнему равен 4 уникальным значениям стран, отличным от NULL, а не 5.
INSERT INTO orders VALUES
(9, 'Frank', 'Phone', NULL),
(10, 'Grace', 'Laptop', NULL);
SELECT COUNT(DISTINCT country) AS unique_countries_no_null
FROM orders;Сравнение COUNT(*), COUNT(col) и COUNT(DISTINCT col)
Полезно увидеть все три варианта COUNT рядом:
- COUNT(*) — подсчитывает каждую строку, включая строки со значениями NULL
- COUNT(country) — подсчитывает строки, в которых страна не равна NULL
- COUNT(DISTINCT country) — подсчитывает уникальные значения страны, отличные от NULL
Выполните этот запрос для обновлённой таблицы (теперь в ней 10 строк, 2 из которых содержат NULL в столбце страны), чтобы подтвердить различия.
SELECT COUNT(*) AS total_rows,
COUNT(country) AS non_null_countries,
COUNT(DISTINCT country) AS unique_countries
FROM orders;Практический пример: активные пользователи за день
Одно из самых распространённых применений COUNT(DISTINCT ...) в аналитике — подсчёт активных пользователей за день (DAU). У Вас есть журнал событий, и Вы хотите узнать, сколько уникальных пользователей проявляли активность в каждый день.
Сгруппируйте данные по дате с помощью GROUP BY и выполните COUNT(DISTINCT идентификатор пользователя), чтобы получить количество уникальных пользователей за каждый день: повторные нажатия одного пользователя автоматически исключаются.
CREATE TABLE user_events (
event_date DATE,
user_id INT
);
INSERT INTO user_events VALUES
('2024-01-01', 1), ('2024-01-01', 2), ('2024-01-01', 1),
('2024-01-02', 2), ('2024-01-02', 3), ('2024-01-02', 2),
('2024-01-03', 1), ('2024-01-03', 4);
SELECT event_date,
COUNT(DISTINCT user_id) AS daily_active_users
FROM user_events
GROUP BY event_date
ORDER BY event_date;Быстрая проверка
Проверьте своё понимание принципа работы COUNT(DISTINCT ...) с помощью этого вопроса.
Итоги урока
Отличная работа! Вот краткое содержание того, что Вы узнали о COUNT(DISTINCT ...):
COUNT(DISTINCT column)подсчитывает только уникальные значения, отличные от NULL, в столбце.- Эта функция отличается от
COUNT(*)(все строки) иCOUNT(column)(строки, отличные от NULL). - Она работает вместе с WHERE, позволяя фильтровать строки перед подсчётом.
- Она работает вместе с GROUP BY, позволяя подсчитывать уникальные значения для каждой группы.
- Значения NULL всегда исключаются из подсчёта уникальных значений.
- В одном SELECT может находиться несколько выражений
COUNT(DISTINCT ...). - К распространённым практическим применениям относятся подсчёт уникальных пользователей, товаров, стран и сеансов.
Освоив эту функцию, Вы получите мощный инструмент для исследования данных и аналитики.
Часто задаваемые вопросы
Урок «Подсчёт уникальных значений» бесплатный?
Да — полный текст урока «Подсчёт уникальных значений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Подсчёт уникальных значений»?
Практическое применение COUNT(DISTINCT ...) Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Подсчёт уникальных значений»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы SELECT DISTINCT
- DISTINCT для нескольких столбцов
- PostgreSQL DISTINCT ON
- Подсчёт уникальных значений