DISTINCT COUNT в DAX: как использовать для подсчета уникальных значений

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Для кого эта статья:

  • аналитики данных и 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Подсчет с итерацией по таблицеС использованием выраженийЗависит от выражения
Кинга Идем в IT: пошаговый план для смены профессии

Практические сценарии применения DISTINCT COUNT

Виктор Соколов, Старший BI-аналитик

Однажды в нашем e-commerce проекте возникла серьезная проблема: отдел маркетинга и финансов спорили о количестве уникальных покупателей. Маркетологи утверждали, что привлекли 12 000 новых клиентов за квартал, а финансисты настаивали, что транзакций от новых клиентов было всего около 9 000.

Разбираясь в ситуации, я обнаружил, что маркетологи считали всех зарегистрированных пользователей, а финансисты — только тех, кто совершил покупку. Для решения проблемы я создал дашборд с тремя ключевыми метриками:

  1. Всего зарегистрированных: COUNT(Users[UserID])
  2. Уникальных покупателей: DISTINCTCOUNT(Sales[CustomerID])
  3. Коэффициент конверсии: [Уникальных покупателей] / [Всего зарегистрированных]

Благодаря использованию DISTINCTCOUNT мы получили точное число покупателей независимо от того, сколько покупок совершил каждый из них. Это решение не только примирило отделы, но и стало основой для реалистичной оценки эффективности маркетинговых кампаний.

DISTINCTCOUNT — универсальный инструмент, решающий множество аналитических задач. Вот несколько классических сценариев применения:

  1. Подсчет уникальных клиентов — основа для расчета метрик удержания и привлечения:
Monthly Active Users = DISTINCTCOUNT(UserActivity[UserID])
  1. Анализ ассортимента — сколько разных товаров было продано в каждой категории:
Products Sold = DISTINCTCOUNT(Sales[ProductID])
  1. Оценка географического охвата — подсчет количества городов/стран, где представлен ваш бизнес:
Market Coverage = DISTINCTCOUNT(Customers[Country])
  1. Многомерный анализ — комбинирование с другими функциями для сложных КПЭ:
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:

  1. Денормализация для оптимизации — иногда имеет смысл избыточно хранить ключевые идентификаторы в фактической таблице
  2. Предрасчет уникальных значений — используйте вычисляемые таблицы для агрегации
  3. Оптимизация структуры данных — правильная организация модели данных
  4. Использование более эффективных альтернатив — в некоторых случаях

Рассмотрим практический пример оптимизации. Допустим, у нас есть таблица продаж с миллионами строк, и мы хотим подсчитать уникальных клиентов по разным срезам.

Неоптимизированный подход:

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 для анализа уникальных значений. Подсчет уникальных клиентов, продуктов или транзакций становится не просто технической задачей, а стратегическим инструментом для принятия бизнес-решений. Выбирая правильную технику подсчета и оптимизируя её выполнение, вы превращаете сырые данные в ценные инсайты, которые действительно влияют на бизнес-результаты. Помните — каждое уникальное значение в ваших данных имеет уникальную историю, которую нужно правильно рассказать.