Объединение (группировка) значений при помощи функций DAX

Что делать, если для анализа необходимо объединить простые значения в диапазоны. Решить эту проблему поможет объединение (группировка) значений при помощи функций DAX.

Что хотим сделать

Скажем, я хотел проанализировать производительность запросов в моей базе данных SQL Server. У меня есть журнал, в котором содержатся сведения о времени выполнения запроса и количестве строк, которые запрос вернул. Я хочу понять, как количество возвращаемых строк влияет на производительность. Для этого загружаю данные в PowerPivot и создаю новую сводную таблицу, в которую поместил строками значение «Возвращено строк» (Rows Returned), и значениями «Средняя продолжительность» (Average Duration). У меня получилась такая таблица:

Исходные данные сводной таблицы

Результаты показывают мне уникальное количество строк, которые возвращали запросы и их среднюю продолжительность. Значение поля «Возвращено строк» находится в диапазоне от 0 до 172 028 053. Я добавил меру показывающую количество выполненных запросов для каждого результата.

Как это сделать

Для каждого отдельного результата по значению «Возвращено строк» среднее время выполнения запроса не настолько полезно. Я хочу объединить (сгруппировать), значения «Возвращено строк» в группы и проанализировать средние значения для группы. Что бы это сделать необходимо:

  1. Создать таблицу в моей рабочей книге Excel

Объединение (группировка) значений при помощи функций DAX

2. Добавить таблицу к модели данных и назвать ее «Блоки» (Buckets)

Меню добавления данных в модель PowerPivot

Таблица в модели PowerPivot полученная из данных рабочего листа

3. Добавить вычисляемый столбец с именем «Диапазон строки» (Row Range) к таблице QueryLog и вставить в него следующую формулу

“=CALCULATE(VALUES(‘Buckets'[Bucket Name]),filter(‘Buckets’, ‘Buckets'[start]<=[Rows Returned] && ‘Buckets'[end]>=[Rows Returned]))”

Рассмотрим расчет формулы на примере

Пример расчета формулы DAX

— VALUES(‘Buckets'[Bucket Name]) возвращает все имена блоков

Промежуточный результат вычисления формулы DAX

— CALCULATE(…) так как нам необходимо только одно значение имени блока, а не полный список, изменяем контекст фильтра.

— filter(‘Buckets’,… && …) мы хотим фильтровать список по двум полям таблицы «Блоки», поэтому мы используем функцию фильтра внутри вычисления, а так же используем && для определения условия фильтрации.

— ‘Buckets'[start]<=[Rows Returned]  ищет все строки, где начальное значение блока меньше или равно количеству строк, которые вернул запрос

Промежуточный результат вычисления формулы DAX

— && ‘Buckets'[end]>=[Rows Returned] и где последнее значение диапазона больше или равно количеству строк, которые вернул запрос

Промежуточный результат вычисления формулы DAX

Теперь в сводной таблице я смогу использовать сгруппированные по диапазону значения в строках, и в результате получу:

Результат группировки данных формулой DAX

https://blogs.msdn.microsoft.com/analysisservices/2014/06/05/bucketing-values-in-dax/

Добавить комментарий