DISTINCT COUNT в DAX: как использовать для подсчета уникальных значений
Пройдите тест, узнайте какой профессии подходите
Для кого эта статья:
- аналитики данных и BI-специалисты
- профессионалы, работающие с Power BI и DAX
- люди, интересующиеся оптимизацией аналитических процессов в бизнесе
Анализ данных часто требует подсчета уникальных значений — будь то уникальные клиенты, уникальные продукты или неповторяющиеся транзакции. В мире Power BI для этой задачи существует мощный инструмент — функция DISTINCTCOUNT
в DAX. Меня постоянно удивляет, как много аналитиков всё ещё используют громоздкие обходные пути, когда можно применить элегантное решение одной формулой. 📊 Давайте разберемся, как функция DISTINCTCOUNT
может превратить хаос дублирующихся данных в четкие, точные метрики, на которые можно опираться при принятии бизнес-решений.
Хотите освоить все тонкости работы с DAX-функциями, включая мастерское использование
DISTINCTCOUNT
? Курс «BI-аналитик» с нуля от Skypro — это именно то, что вам нужно. Программа построена на реальных бизнес-задачах и включает практику создания интерактивных дашбордов в Power BI. За 6 месяцев вы научитесь не только подсчитывать уникальные значения, но и создавать комплексные аналитические решения, которые будут говорить сами за себя. Преподаватели-практики поделятся секретами оптимизации DAX-формул для максимальной производительности.
Функция DISTINCTCOUNT в DAX: основы и синтаксис
DISTINCTCOUNT
— это агрегатная функция DAX, которая возвращает количество различных (уникальных) значений в столбце. В отличие от обычного COUNT
, который подсчитывает все значения, включая дублирующиеся, DISTINCTCOUNT
учитывает каждое уникальное значение только один раз.
Синтаксис функции предельно прост:
DISTINCTCOUNT(column)
Где column — это ссылка на столбец таблицы, по которому нужно подсчитать уникальные значения.
Например, если нам нужно подсчитать количество уникальных клиентов, сделавших покупки:
Unique Customers = DISTINCTCOUNT(Sales[CustomerID])
Важные особенности DISTINCTCOUNT
:
- Учитывает только непустые значения (NULL игнорируются)
- Работает с текстовыми, числовыми, логическими типами данных и датами
- Чувствительна к контексту фильтрации — результат меняется в зависимости от текущих фильтров
- Не может применяться к вычисляемым столбцам напрямую (потребуются дополнительные конструкции)
Глубинное понимание работы DISTINCTCOUNT
требует знания основ контекстов фильтрации в DAX. Когда функция вычисляется внутри меры, она автоматически учитывает все активные фильтры, применённые к текущему срезу данных, что делает её идеальным инструментом для интерактивных отчётов. 🔍
Функция | Описание | Применимость | Обработка NULL |
---|---|---|---|
COUNT | Подсчитывает все значения, включая дубликаты | Все типы данных | Игнорирует NULL |
DISTINCTCOUNT | Подсчитывает только уникальные значения | Все типы данных | Игнорирует NULL |
COUNTROWS | Подсчитывает строки в таблице | Только таблицы | Учитывает все строки |
COUNTX | Подсчет с итерацией по таблице | С использованием выражений | Зависит от выражения |

Практические сценарии применения DISTINCT COUNT
Виктор Соколов, Старший BI-аналитик
Однажды в нашем e-commerce проекте возникла серьезная проблема: отдел маркетинга и финансов спорили о количестве уникальных покупателей. Маркетологи утверждали, что привлекли 12 000 новых клиентов за квартал, а финансисты настаивали, что транзакций от новых клиентов было всего около 9 000.
Разбираясь в ситуации, я обнаружил, что маркетологи считали всех зарегистрированных пользователей, а финансисты — только тех, кто совершил покупку. Для решения проблемы я создал дашборд с тремя ключевыми метриками:
- Всего зарегистрированных:
COUNT(Users[UserID])
- Уникальных покупателей:
DISTINCTCOUNT(Sales[CustomerID])
- Коэффициент конверсии:
[Уникальных покупателей] / [Всего зарегистрированных]
Благодаря использованию DISTINCTCOUNT
мы получили точное число покупателей независимо от того, сколько покупок совершил каждый из них. Это решение не только примирило отделы, но и стало основой для реалистичной оценки эффективности маркетинговых кампаний.
DISTINCTCOUNT
— универсальный инструмент, решающий множество аналитических задач. Вот несколько классических сценариев применения:
- Подсчет уникальных клиентов — основа для расчета метрик удержания и привлечения:
Monthly Active Users = DISTINCTCOUNT(UserActivity[UserID])
- Анализ ассортимента — сколько разных товаров было продано в каждой категории:
Products Sold = DISTINCTCOUNT(Sales[ProductID])
- Оценка географического охвата — подсчет количества городов/стран, где представлен ваш бизнес:
Market Coverage = DISTINCTCOUNT(Customers[Country])
- Многомерный анализ — комбинирование с другими функциями для сложных КПЭ:
Avg Orders Per Customer =
DIVIDE(
COUNT(Sales[OrderID]),
DISTINCTCOUNT(Sales[CustomerID])
)
Особенно полезно использование DISTINCTCOUNT
в сочетании с временным интеллектом DAX. Это позволяет отслеживать динамику уникальных значений за разные периоды:
New Customers This Month =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerID]),
DATESBETWEEN(Sales[OrderDate], STARTOFMONTH(TODAY()), ENDOFMONTH(TODAY()))
)
New Customers Previous Month =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerID]),
DATESBETWEEN(
Sales[OrderDate],
STARTOFMONTH(EDATE(TODAY(), -1)),
ENDOFMONTH(EDATE(TODAY(), -1))
)
)
Growth Rate =
DIVIDE(
[New Customers This Month] – [New Customers Previous Month],
[New Customers Previous Month]
)
Такой подход позволяет создавать динамические отчеты, отражающие изменения в бизнесе с течением времени. 📈 Объединяя DISTINCTCOUNT
с другими функциями DAX, вы получаете инструмент для создания продвинутой аналитики, выходящей за рамки простого подсчета.
Оптимизация производительности при подсчете уникальных
DISTINCTCOUNT
— ресурсоемкая операция, особенно на больших наборах данных. Когда ваша модель разрастается до миллионов строк, неоптимизированное использование этой функции может существенно замедлить работу отчетов. Давайте рассмотрим, как избежать производительных проблем. 🚀
Основные принципы оптимизации DISTINCTCOUNT
:
- Денормализация для оптимизации — иногда имеет смысл избыточно хранить ключевые идентификаторы в фактической таблице
- Предрасчет уникальных значений — используйте вычисляемые таблицы для агрегации
- Оптимизация структуры данных — правильная организация модели данных
- Использование более эффективных альтернатив — в некоторых случаях
Рассмотрим практический пример оптимизации. Допустим, у нас есть таблица продаж с миллионами строк, и мы хотим подсчитать уникальных клиентов по разным срезам.
Неоптимизированный подход:
Total Unique Customers = DISTINCTCOUNT(Sales[CustomerID])
Оптимизированный подход с предварительной агрегацией:
// Создаем вычисляемую таблицу с предварительной агрегацией
Customer_Date_Aggregation =
SUMMARIZE(
Sales,
Sales[CustomerID],
Sales[OrderDate]
)
// Теперь используем эту таблицу для вычисления уникальных клиентов
Total Unique Customers =
DISTINCTCOUNT(Customer_Date_Aggregation[CustomerID])
Этот подход может дать 5-10-кратное ускорение на больших наборах данных, так как DISTINCTCOUNT
будет работать с гораздо меньшим количеством строк.
Фактор оптимизации | Потенциальное улучшение | Сложность внедрения | Применимость |
---|---|---|---|
Предварительная агрегация | Высокое (до 10x) | Средняя | Универсальная |
Оптимизация модели данных | Среднее (2-5x) | Высокая | Требует редизайна |
Денормализация ключей | Среднее (3-7x) | Низкая | Для частых запросов |
Использование инкрементальной загрузки | Высокое (для обновлений) | Средняя | Для регулярных обновлений |
Другие важные советы по оптимизации:
- Используйте целочисленные ключи вместо строковых — это ускоряет работу
DISTINCTCOUNT
- Применяйте сжатие данных в Power BI для уменьшения размера модели
- Рассмотрите возможность использования DirectQuery только для больших таблиц с частыми обновлениями
- Профилируйте производительность с помощью DAX Studio для выявления узких мест
Помните, что оптимизация всегда требует баланса между производительностью, сложностью модели и удобством её обслуживания. Не оптимизируйте преждевременно — сначала измерьте реальную производительность и выявите проблемные места.
Распространенные ошибки при работе с DISTINCTCOUNT
Алексей Дроздов, Lead BI Engineer
Пару лет назад работал я над проектом для крупной розничной сети. Финансовый департамент жаловался на расхождения в отчётах: цифры по уникальным клиентам в Power BI не сходились с их внутренними системами.
Изучив отчёты, я обнаружил дьявол в деталях. В одной из ключевых мер аналитик использовал:
Unique Customers = DISTINCTCOUNT(Transactions[Customer Name])
Проблема оказалась в том, что имена клиентов иногда записывались по-разному: "Иванов И.И." и "Иванов Иван Иванович" система считала разными людьми, хотя это был один и тот же клиент с одинаковым ID.
Решение было простым — заменить формулу на:
Unique Customers = DISTINCTCOUNT(Transactions[CustomerID])
Эта простая замена мгновенно исправила расхождение в 12%, и финансовый директор наконец перестал сомневаться в цифрах дашборда. Мораль: всегда используйте для DISTINCTCOUNT
столбцы, которые действительно уникально идентифицируют объекты, а не их описательные атрибуты.
Даже опытные аналитики иногда допускают ошибки при использовании DISTINCTCOUNT
. Зная эти подводные камни, вы сможете избежать типичных проблем и сохранить точность ваших отчётов. 🚩
Ошибка №1: Подсчет уникальных значений по неправильному столбцу
Часто аналитики пытаются посчитать уникальных клиентов, используя их имена вместо ID:
// Неправильно – имена могут дублироваться или иметь разное написание
Unique Customers = DISTINCTCOUNT(Customers[CustomerName])
// Правильно – ID гарантированно уникален
Unique Customers = DISTINCTCOUNT(Customers[CustomerID])
Ошибка №2: Игнорирование контекста фильтрации
DISTINCTCOUNT
чувствителен к контексту фильтрации. Иногда требуется игнорировать определённые фильтры:
// Ошибочно – будет меняться при выборе категории
Total Unique Customers = DISTINCTCOUNT(Sales[CustomerID])
// Правильно – игнорирует фильтр по категории
Total Unique Customers =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerID]),
ALL(Products[Category])
)
Ошибка №3: Неправильное использование с отношениями "многие-ко-многим"
В сложных моделях с отношениями M:M подсчет уникальных значений может дать неожиданные результаты:
// Может давать неверные результаты при M:M
Unique Products = DISTINCTCOUNT(Sales[ProductID])
// Более надежный подход
Unique Products =
CALCULATE(
DISTINCTCOUNT(Products[ProductID]),
CROSSFILTER(Sales[ProductID], Products[ProductID], NONE)
)
Ошибка №4: Забывать про NULL-значения
DISTINCTCOUNT
игнорирует NULL-значения. Если это критично для анализа, требуется особый подход:
// Стандартный DISTINCTCOUNT игнорирует NULL
Count Including NULLs =
VAR CountDistinct = DISTINCTCOUNT(Data[Column])
VAR HasNulls = CALCULATE(
COUNTROWS(Data),
ISBLANK(Data[Column])
) > 0
RETURN CountDistinct + IF(HasNulls, 1, 0)
Ошибка №5: Неоптимальное использование в сложной визуализации
При создании матриц или таблиц с множеством срезов, вычисление DISTINCTCOUNT
для каждой ячейки может серьезно замедлить отчет. Лучше предварительно агрегировать данные.
Как избежать типичных ошибок:
- Всегда проверяйте результаты
DISTINCTCOUNT
на малом наборе данных, где можно вручную подтвердить результат - Тщательно проектируйте модель данных, учитывая будущие потребности в подсчете уникальных значений
- Используйте DAX-запросы для отладки формул до их внедрения в отчеты
- Документируйте логику расчета уникальных значений для будущего обслуживания
Сомневаетесь, какое направление карьеры в аналитике подойдёт именно вам? Работа с DAX-формулами и визуализация данных — только одна из многих дорог. Пройдите Тест на профориентацию от Skypro, чтобы узнать, подходит ли вам роль BI-аналитика или стоит рассмотреть другие направления в данных. Тест займёт всего 5 минут и даст персонализированные рекомендации по развитию карьеры в аналитике. Вы получите индивидуальную карту развития с учётом ваших навыков, предпочтений и амбиций.
Альтернативные методы подсчета уникальных значений в DAX
Хотя DISTINCTCOUNT
— это мощный инструмент, он не всегда оптимален для всех сценариев. В зависимости от конкретных требований, размера датасета и структуры модели данных, альтернативные подходы могут обеспечить лучшую производительность или функциональность. 🔄
1. Использование SUMMARIZE + COUNTROWS
Эта комбинация может быть более эффективной для больших наборов данных:
Unique Customers =
COUNTROWS(
SUMMARIZE(
Sales,
Sales[CustomerID]
)
)
2. Применение VALUES + COUNTROWS
Для столбцов с небольшим количеством уникальных значений:
Unique Categories =
COUNTROWS(
VALUES(Products[CategoryName])
)
3. Подход через SUMX + DISTINCTCOUNT
Когда нужно посчитать уникальные значения в разрезе другого измерения:
Products Per Category =
SUMX(
VALUES(Products[CategoryName]),
CALCULATE(
DISTINCTCOUNT(Products[ProductID])
)
)
4. Использование EXCEPT для сравнения уникальных значений
Для анализа уникальных значений, появившихся в текущем периоде:
New Customers This Month =
VAR CurrentCustomers =
CALCULATETABLE(
VALUES(Sales[CustomerID]),
Sales[Date] = SELECTEDVALUE(Dates[Date])
)
VAR PreviousCustomers =
CALCULATETABLE(
VALUES(Sales[CustomerID]),
Sales[Date] < SELECTEDVALUE(Dates[Date])
)
RETURN
COUNTROWS(
EXCEPT(CurrentCustomers, PreviousCustomers)
)
5. COUNTROWS + GENERATEALL
Сложный, но мощный метод для сценариев с множественными отношениями:
Unique Related Entities =
COUNTROWS(
GENERATEALL(
VALUES(Dimension[ID]),
CALCULATETABLE(
VALUES(RelatedFact[MeasureID])
)
)
)
Сравнение альтернативных методов:
- DISTINCTCOUNT — прост в использовании, понятен, но может быть менее производителен
- SUMMARIZE + COUNTROWS — часто более производительный для больших таблиц, но сложнее читать
- VALUES + COUNTROWS — отлично работает для столбцов с низкой кардинальностью
- SUMX + DISTINCTCOUNT — хорош для сложных вычислений с группировкой
- EXCEPT — незаменим для анализа изменений во времени
Правильный выбор метода зависит от:
- Объема данных и требований к производительности
- Сложности модели данных и количества связей
- Требований к гибкости аналитики и возможности детализации
- Уровня поддержки кода другими членами команды
Стоит помнить, что в Power BI версии 2025 года появились дополнительные функции, которые могут упростить подсчет уникальных значений в определенных сценариях. Не стесняйтесь экспериментировать с разными подходами на копии вашей модели данных, сравнивая производительность и точность результатов.
DISTINCTCOUNT
— это всего лишь верхушка айсберга возможностей DAX для анализа уникальных значений. Подсчет уникальных клиентов, продуктов или транзакций становится не просто технической задачей, а стратегическим инструментом для принятия бизнес-решений. Выбирая правильную технику подсчета и оптимизируя её выполнение, вы превращаете сырые данные в ценные инсайты, которые действительно влияют на бизнес-результаты. Помните — каждое уникальное значение в ваших данных имеет уникальную историю, которую нужно правильно рассказать.