Как подсчитать уникальные записи с group by в SQL Server
Быстрый ответ
Для подсчёта количества уникальных записей в определённом столбце можно использовать следующий запрос:
SELECT COUNT(DISTINCT column_name) FROM table_name;
При использовании данного запроса будет получено число уникальных значений в столбце column_name
таблицы table_name
, при этом дублирующиеся значения игнорируются.
Счёт уникальных значений без применения символа звёздочки
Не стоит использовать COUNT(DISTINCT *)
. DISTINCT
предназначен для применения к конкретным столбцам с целью получения точных результатов. В различных ситуациях корректный запрос может выглядеть так:
-- До свидания, дубликаты. Здравствуй, точность!
SELECT program_type, COUNT(DISTINCT program_name) AS Count
FROM cm_production
WHERE push_number = @push_number
GROUP BY program_type;
В данном запросе проводится выборка с фильтрацией по push_number
, группировкой по program_type
и подсчётом уникальных значений program_name
.
Чёткость результатов благодаря использованию псевдонимов и фильтрации
Псевдонимы упрощают восприятие результатов запроса: используйте, например, AS Count
для подсчитанных уникальных значений или AS [Type]
для удобного отображения полей. Применение переменных, таких как @push_number
, облегчает фильтрацию:
-- Переменные облегчают формулировку запросов. Попробуйте их!
DECLARE @push_number INT = 1234;
SELECT program_type AS [Type], COUNT(DISTINCT program_name) AS Count
FROM cm_production
WHERE push_number = @push_number
GROUP BY program_type
ORDER BY Count DESC, [Type];
В данном запросе результаты сортируются вначале по количеству, затем по типу программы. Приоритет отдаётся информационному содержимому запрашиваемых данных.
Использование подзапросов для повышения точности данных
Применяйте подзапросы или производные таблицы для подсчёта уникальных значений в случае сложных запросов:
-- Подзапросы — потому что насчитывание вручную занимает слишком много времени!
SELECT COUNT(*)
FROM (
SELECT DISTINCT program_name
FROM cm_production
WHERE push_number = @push_number
) AS unique_programs;
С помощью этого запроса можно аккуратно подсчитать уникальные program_name
, связанные с push_number
, используя подзапрос.
Визуализация
Для более наглядного понимания рассмотрим практический пример с использованием SELECT COUNT(*) WITH DISTINCT
. Допустим, мы считаем различные виды деревьев в лесу:
🌳🌳🌲🌲🌴🌴🌴🌲🌳🌲🌴🌲🌳🌲
Нас интересуют только разные виды деревьев:
Различные виды: 🌳, 🌲, 🌴.
Теперь подсчитаем их количество:
Количество различных видов: 3
Именно это и делает COUNT(DISTINCT column)
— ищет уникальные значения и количество таких.
SELECT COUNT(DISTINCT species) FROM forest;
В нашем SQL-примере лес — это табличные данные, а деревья — отдельные записи.
Устранение значений NULL
Для игнорирования значений NULL
в подсчёте используйте условие WHERE column_name IS NOT NULL
:
SELECT COUNT(DISTINCT column_name)
FROM table_name
WHERE column_name IS NOT NULL;
Такой подход позволит исключить "фантомные" записи из подсчёта.
Адаптация SQL-скриптов
Для подсчёта уникальных регионов и типов программ вам может пригодиться универсальный SQL-скрипт:
-- Конкатенация — ключевой элемент для определения уникальности!
SELECT COUNT(DISTINCT CONCAT(region, program_type)) AS UniqueRegionTypes
FROM cm_production
WHERE push_number = @push_number;
Применяя функцию CONCAT
, мы создаём уникальный идентификатор, что позволяет решить задачу.
Совместимость с устаревшими версиями SQL
Если вы работаете в SQL Server 2005, некоторые конструкции могут не поддерживаться. Вместо CONCAT
используйте оператор +
, а для значений NULL
применяйте ISNULL
.
Полезные материалы
- SQL SELECT DISTINCT Statement — Обзор использования
DISTINCT
в SQL-запросах. - SQL Aggregate Functions | Intermediate SQL – Mode — Руководство по агрегатным функциям в SQL, включая
COUNT
. - PostgreSQL: Documentation: 16: SELECT — Описание использования
SELECT
иDISTINCT
в официальной документации PostgreSQL. - What is the difference between select count(*) and select count(any_non_null_column)? — Обсуждение особенностей функции
COUNT
на сайте Stack Exchange. - Error 404 (Not Found)!!1 — Бывшее подробное руководство по использованию функции
COUNT()
в SQL Server, в настоящий момент недоступно. Возможно, в скором времени информация будет восстановлена!