Функция расчета DAX с и без фильтра - PullRequest
0 голосов
/ 24 мая 2018

Какая разница в результатах функции CALCULATE, если мы используем ее с функцией FILTER и без нее.Предположим, у нас есть эти две меры:

Measure1 = CALCULATE([X], 'FactTable'[Color]="Red")

Measure2 = CALCULATE([X], FILTER('FactTable', 'FactTable'[Color]="Red")

Обновление.Дополнительный вопрос о вознаграждении:
Есть ли способ изменить Measure2 , используя другие функции, такие как ALL или ALLSELECTED, чтобы он возвращал точно такие же результаты, как Мера1 ?

Обновление после вознаграждения
Я решил предоставить вознаграждение за ответ, отличный от принятого мной.

Ответы [ 4 ]

0 голосов
/ 05 июня 2018

Синтаксис DAX автоматической функции FILTER, сгенерированной DAX вместо логического выражения, требует, чтобы вы выражали один столбец в выражении фильтра.Давайте рассмотрим этот пример -

Measure1 = CALCULATE([X], 'FactTable'[Color]="Red")

Синтаксис, приведенный выше, внутренне преобразован в следующий, который вы могли бы написать явным образом, получая то же поведение из вашей меры DAX.

Measure1 = CALCULATE([X], FILTER(ALL('FactTable'[Color]), 'FactTable'[Color]="Red"))

Таким образом, если вы используете последнюю функцию в значении Measure2, она получит тот же результат.

Для получения дополнительной информации вы можете перейти по этой ссылке.

0 голосов
/ 24 мая 2018

Не только результаты, но и способ получения этих результатов для обеих мер не будет одинаковым.

Я создал две меры, аналогичные вашему примеру, чтобы проверить это:

TestAvgNoFilter = CALCULATE([PrcAvg]; cal[ReadDate]=DATE(2018;05;23))
TestAvgFilter = CALCULATE([PrcAvg]; filter(cal; cal[ReadDate]=DATE(2018;05;23)))

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

pic1

Однако:

  1. Использование FILTER оказывает значительное влияние на производительность, что может бытьотчетливо видны планы запросов и использование Storage Engine против Formula Engine.Он создает дополнительную временную таблицу, которая должна ему «взаимодействовать» с уже существующими фильтрами, поступающими из самой таблицы отчета / сводной таблицы (строки, столбцы, слайсеры).Вы ничего не заметите для простого среднего значения в одной ячейке, но если ваша мера [x] сложна и существует много таких «начальных» фильтров, разница во времени расчета может быть огромной.

  2. FILTER сохраняет и выполняет итерацию с начальным контекстом фильтра, тогда как выражение фильтра, используемое непосредственно в CALCULATE, игнорирует его.Посмотрите, что произойдет, когда я добавлю ReadDate в сводную таблицу:

pic2

Именно поэтому показатель без FILTERбыстрее: ему все равно, какие даты в столбцах - он уже рассчитал одно «истинное» значение, в то время как мера с FILTER сравнивает себя с исходными фильтрами для каждой строки.

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

Как правило, я бы советовал вам не использовать FILTER, когда вам это не нужно.Сохраните его энергию, когда это действительно необходимо.

0 голосов
/ 24 мая 2018

Разница в том, что CALCULATE допускает простые фильтры, которые заменят существующий контекст фильтра.В вашем примере CALCULATE вычислит меру [X] с использованием существующего контекста фильтра, за исключением того, что он удаляет любой существующий контекст фильтра для FactTable[Color] и заменяет его на FactTable[Color] = Red.

Функция FILTERявляется итератором, что означает, что он проходит по таблице (передаваемой в качестве первого аргумента) по одной строке за раз и оценивает выражение (второй аргумент) для каждой строки.Когда у вас есть FILTER функция внутри CALCULATE, она объединит существующий контекст фильтра с результатами FILTER (вместо того, чтобы заменить его как простой аргумент фильтра).

В общем,Вы хотите использовать простые фильтры всякий раз, когда у вас есть выбор, поскольку вычисления будут более эффективными.Однако функция FILTER позволяет выполнять гораздо более сложную фильтрацию, поэтому она по-прежнему очень полезна в случаях, когда простых фильтров недостаточно.


Дополнительная информация: FILTER () - Когда, Почему и как его использовать

0 голосов
/ 24 мая 2018

Меры, которые вы создали, будут иметь тот же результат, что и вы передаете только одно значение для фильтрации в цвет "Красный".

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

В Measure2 вы можете передать диапазон определенных значений, используя функцию FILTER из определенной таблицы и столбца, чтобы получить желаемый результат.

Measure2 = CALCULATE([X], FILTER('FactTable', 'FactTable'[Color])

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

Более подробную информацию о функции FILTER можно найти, например, о том, как она работает.здесь -

https://msdn.microsoft.com/en-us/query-bi/dax/filter-function-dax

...