Предотвращение использования FILTER в качестве аргумента фильтра

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

Примечание.

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

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

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

Red Sales =
CALCULATE(
    [Sales],
    FILTER('Product', 'Product'[Color] = "Red")
)

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

Ниже приведено улучшенное определение меры, которое использует логическое выражение вместо табличного выражения. Функция KEEPFILTERS DAX гарантирует сохранение всех существующих фильтров, применяемых к столбцу Color , и не перезаписывается.

Red Sales =
CALCULATE(
    [Sales],
    KEEPFILTERS('Product'[Color] = "Red")
)

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

Однако существуют ограничения, которые применяются к логическим выражениям, когда они используются в качестве аргументов фильтра. Они:

  • они не позволяют сослаться на столбцы из нескольких таблиц;
  • Не удается ссылаться на меру
  • Не удается использовать вложенные функции CALCULATE
  • Не удается использовать функции, которые сканируют или возвращают таблицу

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

Рассмотрим теперь другое определение меры. Требуется вычислить продажи, но только для месяцев, в которые была получена прибыль.

Sales for Profitable Months =
CALCULATE(
    [Sales],
    FILTER(
        VALUES('Date'[Month]),
        [Profit] > 0)
    )
)

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

Рекомендации

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

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