Функция FILTER чаще всего используется в паре с CALCULATE, создавая в мере новый внутренний контекст фильтра. В этой статье на простых примерах мы познакомимся с основными принципами того, как она работает.
Возвращает отфильтрованную таблицу
Синтаксис
FILTER ( <Table>, <FilterExpression> )
Параметр | Описание |
<Table> | Любая таблица или табличное выражение |
<FilterExpression> | Логическое выражение, которое должно оцениваться для каждой строки таблицы (<Table>) |
Принцип работы
FILTER может фильтровать строки из таблицы (<Table>), используя любое выражение (<FilterExpression), допустимое в контексте строки.
Функция FILTER для каждой строки <Table> (итератора) проверяет условие, заданное в <FilterExpression>. Если условие выполняется, то возвращается ИСТИНА и такая строка учитывается в фильтрации, если ЛОЖЬ — соответственно нет.
Функция FILTER часто используется как второй аргумент в CALCULATE для создания внутреннего контекста фильтра в вычисляемой мере.
Примеры
В модели данных справочник 'Магазины' имеет связь с таблицей фактов 'Продажи', а значит может ее фильтровать

В следующей мере сумма продаж будет считаться только по Канаде
Сумма продаж Canada =CALCULATE (
SUM ( 'Продажи'[Сумма продаж] ),
FILTER ( 'Магазины', 'Магазины'[Страна] = "Canada" )
)

Чтобы исключить только Канаду поменяем оператор равно (=) на не равно (<>)
Сумма продаж не равно Canada =CALCULATE (
SUM ( 'Продажи'[Сумма продаж] ),
FILTER ( 'Магазины', 'Магазины'[Страна] <> "Canada" )
)

Чтобы включить только Канаду, Францию и Китай добавим в выражение фильтра функцию IN
Сумма продаж (Canada, France, China) =CALCULATE (
SUM ( 'Продажи'[Сумма продаж] ),
FILTER ( 'Магазины', 'Магазины'[Страна] IN { "Canada", "France", "China" } )
)

Чтобы наоборот исключить только Канаду, Францию и Китай дополним выражение функцией NOT
Сумма продаж не равно Canada, France, China =CALCULATE (
SUM ( 'Продажи'[Сумма продаж] ),
FILTER (
'Магазины',
NOT ( 'Магазины'[Страна] IN { "Canada", "France", "China" } )
)
)

Рассмотрим примеры фильтрации на основе операторов неравенств. Отфильтруем таблицу 'Продажи' по сумме продаж больше 10 тыс.$ в одной транзакции. В нашем случае 1 транзакция = 1 строка таблицы 'Продажи'
Сумма продаж > 10 тыс.$ =CALCULATE (
SUM ( 'Продажи'[Сумма продаж] ),
FILTER ( 'Продажи', 'Продажи'[Сумма продаж] > 10000 )
)

В результате мера вернет только строки, в которых сумма продаж > 10тыс.$ (в контексте строки таблицы 'Продажи')
Чтобы вычислить сумму продаж, где продажи по Товарам > 10тыс.$, нам необходимо
1) изменить контекст строки в параметре <Table>
2) использовать в условии фильтра вместо столбца 'Продажи'[Сумма продаж] меру [Сумма продаж]
Благодаря переходу контекста, используя меру в выражении <FilterExpression> , можно фильтровать таблицу на основе динамического вычисления.
Сумма продаж по товарам > 10 тыс.$ =CALCULATE (
SUM ( 'Продажи'[Сумма продаж] ),
FILTER ( 'Товары', [Сумма продаж] > 10000 )
)

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