Избегайте использования FILTER в качестве аргумента фильтра
В качестве моделировщика данных вы обычно создаете выражения DAX, которые необходимо оценивать в измененном контексте фильтрации. Например, можно написать определение меры, чтобы вычислить продажи для "продуктов с высокой маржой". Далее мы рассмотрим этот расчет в этой статье.
Заметка
Эта статья особенно актуальна для вычислений моделей, которые применяют фильтры к таблицам импорта.
Функции CALCULATE и CALCULATETABLEDAX являются важными и полезными функциями. Они позволяют создавать вычисления, которые удаляют или добавляют фильтры или изменяют пути связи. Это делается путем передачи аргументов фильтра, которые являются логическими выражениями, табличными выражениями или специальными функциями фильтра. В этой статье рассматриваются только логические и табличные выражения.
Рассмотрим следующее определение меры, которое вычисляет продажи красных продуктов с помощью табличного выражения. Он заменит все фильтры, которые могут применяться к таблице Product.
Red Sales =
CALCULATE(
[Sales],
FILTER('Product', 'Product'[Color] = "Red")
)
Функция CALCULATE принимает табличное выражение, возвращаемое функцией FILTERDAX, которая вычисляет его выражение фильтра для каждой строки таблицы Product. Он достигает правильного результата — результата продаж для красных продуктов. Однако его можно добиться гораздо эффективнее с помощью логического выражения.
Ниже приведено улучшенное определение меры, которое использует логическое выражение вместо табличного выражения. Функция KEEPFILTERSDAX гарантирует, что все существующие фильтры, примененные к столбцу Color, сохраняются и не перезаписываются.
Red Sales =
CALCULATE(
[Sales],
KEEPFILTERS('Product'[Color] = "Red")
)
По возможности рекомендуется передавать аргументы фильтра в виде логических выражений. Это связано с тем, что таблицы модели импорта хранятся в памяти в виде колоночных хранилищ. Они явно оптимизированы для эффективного фильтрации столбцов таким образом.
Однако существуют ограничения, которые применяются к логическим выражениям, когда они используются в качестве аргументов фильтра. Они:
- Не удается ссылаться на столбцы из нескольких таблиц
- Не удается ссылаться на меру
- Не удается использовать вложенные функции CALCULATE
- Не удается использовать функции, которые сканируют или возвращают таблицу
Это означает, что вам потребуется использовать табличные выражения для более сложных требований к фильтру.
Рассмотрим теперь другое определение меры. Требование заключается в расчете продаж, но только для тех месяцев, имеющих прибыль.
Sales for Profitable Months =
CALCULATE(
[Sales],
FILTER(
VALUES('Date'[Month]),
[Profit] > 0
)
)
В этом примере необходимо использовать функцию FILTER. Это потому, что это требует оценки мер прибыли, чтобы устранить те месяцы, которые не принесли прибыли. Невозможно использовать меру в логическом выражении, если она используется в качестве аргумента фильтра.
Рекомендации
Для оптимальной производительности рекомендуется использовать логические выражения в качестве аргументов фильтра по возможности.
Таким образом, FILTER функцию следует использовать только при необходимости. Его можно использовать для фильтрации сложных сравнений столбцов. Эти сравнения столбцов могут включать:
- Меры
- Другие столбцы
- Использование функции ORDAX или логического оператора OR (||)
Связанное содержимое
- функции фильтра (DAX)
- Схема обучения: Использование DAX в Power BI Desktop
- Вопросы? Попробуйте задать вопрос сообществу Power BI
- Предложения? Вносите идеи по улучшению Power BI