Использование DISTINCT с функцией COUNT() OVER в SQL Server
Быстрый ответ
WITH CTE AS (
SELECT DISTINCT key, category FROM table
)
SELECT
category, COUNT(key) OVER (PARTITION BY category) AS distinct_count
FROM CTE;
Использование конструкции CTE помогает нам избежать дублирования записей при подсчёте и получить количество уникальных записей в каждой категории.
Профессиональные альтернативы
Использование DENSE_RANK
WITH Ranked AS (
SELECT
key,
category,
DENSE_RANK() OVER (PARTITION BY category ORDER BY key) AS dr
FROM table
WHERE key IS NOT NULL
)
SELECT
category,
MAX(dr) AS distinct_count
FROM Ranked
GROUP BY category;
Функция DENSE_RANK()
позволяет нам определить максимальный ранг, который и будет отображать количество уникальных значений в каждой категории. Запомните, что NULL значения должны обрабатываться отдельно.
Подробнее об этом расскажет наш спикер на видео
SQL Server 2012: Использование DISTINCT совместно с OVER()
В SQL Server 2012 и более поздних версиях появилась возможность использовать COUNT(DISTINCT)
с OVER()
.
SELECT
category,
COUNT(DISTINCT key) OVER (PARTITION BY category) AS distinct_count
FROM table;
Эта функциональность доступна для тестирования здесь.
Визуализация
Список гостей (👥): [Алиса, Боб, Чарли, Алиса, Боб]
COUNT() OVER
: Подсчёт приглашенных
📨: [👤 + 👤 + 👤 + 👤 + 👤] = 5
COUNT() OVER
с DISTINCT
: Подсчёт участников вечеринки
🎉: [Алиса, Боб, Чарли] = 3
DISTINCT
позволяет учесть каждого гостя только однажды, не принимая во внимание повторения.
Полезные инструменты
OUTER APPLY для обработки пропусков
SELECT
t.category,
dc.DistinctCount
FROM
(SELECT DISTINCT category FROM table) t
OUTER APPLY (
SELECT COUNT(DISTINCT t2.key) AS DistinctCount
FROM table t2
WHERE t2.category = t.category
) dc;
Связанные подзапросы как надёжное средство
SELECT
DISTINCT category,
(SELECT COUNT(DISTINCT key) FROM table t2 WHERE t2.category = t1.category) AS distinct_count
FROM table t1;
Группировка с использованием подзапросов
SELECT
category,
(SELECT COUNT(DISTINCT key) FROM table t2 WHERE t2.category = t1.category) AS distinct_count
FROM table t1
GROUP BY category;
Продвинутые методы
Подсчёт с учетом определённых условий
SELECT
category,
COUNT(DISTINCT CASE WHEN condition THEN key ELSE NULL END) OVER (PARTITION BY category) AS conditional_distinct_count
FROM table;
Методы агрегации для более удобного подсчёта
SELECT
category,
(SELECT MIN(key) FROM table WHERE category = t.category AND condition) AS conditional_distinct_count
FROM table t
GROUP BY category;
Полезные материалы
- Установка eyeD3 на Webfaction – Stack Overflow — в этом материале подробно рассмотрены тонкости установки eyeD3.
- Описание секции OVER (Transact-SQL) – SQL Server | Microsoft Learn — осваивайте возможности команды OVER с помощью учебных материалов от компании Microsoft.
- Создание оповещений в Журнале аналитики Microsoft Azure — здесь вы научитесь создавать оповещения в системе Azure Log Analytics.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой SQL-запрос используется для подсчёта количества уникальных записей в каждой категории?
1 / 4