Фильтрация строк по множественным условиям с использованием языка M

Фильтрация данных – это одна из самых востребованных операций при работе с большими объемами информации. Часто требуется отфильтровать данные не только по одному условию, но и сразу по нескольким критериям одновременно, настроив порядок следования фильтров, изменив приоритеты или даже добавив исключающие условия («не равно», «содержит»). Для этого достаточно открыть окно редактирования запроса и вручную задать нужное поведение каждого фильтра. В этом кейсе мы рассмотрим несколько способов того, как можно эффективно выполнять фильтрацию строк по множеству условий в Power Query.

Как фильтровать строки по нескольким условиям в Power Query Пример из видео

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

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

Алгоритм решения
  1. Исключить коммунальные платежи стандартным фильтром Power Query.
  2. Скорректировать формулу фильтрации с использованием операторов "and" и "or".
  3. Использовать функцию List.Contains и оператор "not" для исключения некоторых контрагентов

Решение
  1. Для начала воспользуемся стандартным фильтром чтобы сформировать формулу фильтрации.

В результате у нас получится такая формула:

=Table.SelectRows(Источник, each ([Детализация платежа] <> "Коммунальные платежи") )
Table.SelectRows выбирает нужные нам строки по условию, которое мы укажем после слова each, означающего, что операцию нужно проделать с каждой строкой

2. Затем мы корректируем формулу фильтрации, внося туда дополнения.

  • К первому условию, описанному выше, добавим следующее: and ([Детализация платежа] <> "Оплата поставщику".

Это условие позволяет отобрать все платежи, которые не равны "Оплата поставщику", но при этом благодаря "and" (и) выполнить и первое условие (не брать строки, в которых содержатся "Коммунальные платежи").

И, наконец, с помощью оператора "or" (или) мы добавляем третье условие, состоящее из двух частей:

  • ( [Детализация платежа] = "Оплата поставщику"
  • and not List.Contains({"Иванов ИП", "Петров ИП", "Сидоров ИП"},[Контрагент]) )

То есть мы возьмем все строки, у которых детализация платежа равна "Оплата поставщику", но при этом Контрагент не является одним из тех, кто перечислен в списке.

Обратите внимание на расстановку скобок, это крайне важно как в математике!
Маленький аналитик Бизнес-консультант
Маленький аналитик Бизнес-консультант

Думаю, что вы обратили внимание на то, что второе и третье условие соединены не жестким "и", а вариативным "или". Потому, что нам нужны любые строки, не равные "Оплата поставщику" (и не равные "Коммунальные платежи" - первое условие), а так же нужны строки, которые равны "Оплата поставщику", но в которых при этом нет перечисленных контрагентов.

=Table.SelectRows( Источник, each
1 ( [Детализация платежа] <> "Коммунальные платежи" )

and

2 ( [Детализация платежа] <> "Оплата поставщику"
or

3 (
[Детализация платежа] = "Оплата поставщику"
and

not List.Contains( {"Иванов ИП", "Петров ИП", "Сидоров ИП"}, [Контрагент] )
)
)
)
Второе и третье условие связаны оператором "or" и образуют единую группу благодаря верно расставленным скобкам.
Первое условие и группа следующих двух условий связаны оператором "and", заставляющих код отбирать лишь те строки, которые одновременно удовлетворяют и первое правило и группу следующих правил.
Внутри третьего условия две его части так же связаны жестким "and", заставляющим код отобрать лишь те строки, которые будут отвечать обеим частям третьего условия.

Итак, мы настроили порядок следования фильтров, изменили приоритеты и даже добавили исключающее условие «не содержит». Для этого мы немного отредактировали формулу фильтрации.

Заключение

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *