Функция DAX расчета с и без фильтра

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

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

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

обновление. Дополнительный вопрос баунти:
Есть ли способ изменить Measure2 С помощью других функций, таких как ALL или ALLSELECTED, Так что он вернет точно такие же результаты, как Measure1?

обновление после bounty
У меня есть решил дать награду за ответ, отличный от того, который я принял.

4 ответов


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

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

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

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

pic1

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

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

pic2

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

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

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


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

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


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

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

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

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

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

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


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

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

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

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

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

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

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