Фильтровать столбец, используя оператор IF в powerquery - PullRequest
0 голосов
/ 27 апреля 2020

У меня проблемы с фильтрацией моих столбцов в powerquery. Я использую параметр для фильтрации моего NI или SI «острова», однако я изо всех сил пытаюсь найти способ сохранить все данные, когда не введен ни один параметр.

Я хотел бы оставить столбец заполненным ( NI и SI), если вход не предоставлен. Я добавил две картинки на imgur ниже. Я довольно новичок здесь.

Я пытался использовать оператор if, но не смог найти нужный фрагмент кода или, если вообще возможно, сделать это.

Спасибо

введите описание изображения здесь . введите описание изображения здесь

1 Ответ

0 голосов
/ 02 мая 2020

Примечание: см. Самый конец для версии, которая не требует жесткого кодирования значений .

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

if IslandChoice is "NI" or "SI"
    then filter using IslandChoice
else
    show everything

Другой маршрут -

if IslandChoice is not "NI" and is not "SI"
    show everything
else
    filter using IslandChoice

Это зависит от того, хотите ли вы, чтобы недопустимые значения не показывали ничего или все.

Первая проверка "является ли этот фильтр допустимым выбором?

[Island] = "SI" or [Island] = "WI"

Если один из них является истинным, то это хорошо. Если оба являются ложными, то это неверный ключ.

filter_if_valid = Table.SelectRows(
    Source,
    (row) =>
        if IslandChoice = "SI" or IslandChoice = "NI" then 
            row[Island] = IslandChoice            
        else
            true
)

Как это работает, и где each?

each - это нормальная функция. Это sugar, ярлык, который объявляет функцию, которая имеет один arugment. (Если вам нужно больше, используйте объявление функции)

см. больше: Подробная информация о грамматике each находится в документе

each неявно создает переменную с именем _

Поскольку each абстрагирует несколько вещей, сложнее сказать, что происходит.

  1. each создает переменную с именем _, которая ссылается на текущую строку .
  2. each объявляет функцию без аргументов part

Функции имеют вид

(arguments) => return_expression

При написании each удаляется (arguments) => часть.

each return_expression

return_expression может быть простым [Column] = 10 тестом (или он может создать много локальных переменных, используя ga let .. in выражение внутри функции).

Все эти операторы точно равнозначны функции

each [Island] = IslandChoice

each _[Island] = IslandChoice

(_) => _[Island] = IslandChoice

(row) => row[Island] = IslandChoice

Все они

  • объявить function без имени
  • принять ровно 1 аргумент
  • прочитать столбец [Island] в строке текущей таблицы
  • возвращает true, если они равны, иначе false

оригинальный фильтр

после замены each у вас было:

always_filter_table = Table.SelectRows(
    Source, 
    (row) =>
        row[Island] = IslandChoice
),

новый фильтр

filter_if_valid = Table.SelectRows(
    Source,
    (row) =>
        if IslandChoice = "SI" or IslandChoice = "NI" then 
            row[Island] = IslandChoice            
        else
            true
)

фильтр без жестких значений

Он будет работать без каких-либо требований. Создать новый -> blank query

let
    Source = #table(
        {"Island", "Point Of Connection"},
        {
            {"SI", "STK0331"},
            {"SI", "TIM0111"},
            {"NI", "ZEJ2395"},
            {"NI", "XER9345"},
            {"WI", "QXF9785"}
        }
    ),

    is_valid_filter = (value as any, valid_values as list) => 
        List.Contains( valid_values, value ),

    // use one or the other if you want all existing values to be valid
    static_valid_filters = {"SI", "NI"},
    dynamic_valid_filters = List.Distinct(
        Source[Island]
    ),

    IslandChoice = "NI",

    // if filter is a valid value, filter using it. 
    // otherwise show all.
    filtered_when_valid = Table.SelectRows(
        Source,
        (row) =>
            if is_valid_filter(
                IslandChoice, static_valid_filters
            ) then
                row[Island] = IslandChoice            
            else
                true
    )
in
    filtered_when_valid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...