Функция 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 работает в контексте строки, что на больших массивах данных может снижать производительность вычислений.

Скачать пример

Поделитесь, если понравилось