Как отфильтровать столбец по диапазону с помощью Power Query?

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

Допустим, таблица, которую я запрашиваю, содержит 100 уникальных имен. Я хочу импортировать только строки, соответствующие списку из 20 имен, которые есть у меня на листе.

Как я могу сделать это с помощью Power Query?

Изменить: я могу сделать функцию excel для объединения списка имен в формат, необходимый для запроса, например: (= Table.SelectRows(#"Changed Type", each ([Ticket Assignee] ="Name 1" or [Ticket Assignee] ="Name 2"))). Но все же нужен способ ссылаться на это из запроса.

Edit2:

Мой запрос:

Это ошибки с:

Expression.Error: мы ожидали значение FieldsSelector.

let
    names_Source = Excel.CurrentWorkbook(){[Name="namesTable"]}[Content],
    names_Values = names_Source{1},


    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type datetime}, {"Ticket Assignee", type text}, {"# Solved", Int64.Type}}),
    #"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([Ticket Assignee] <> null)),
    #"Filtered Rows1" = Table.SelectRows(#"Changed Type", each Record.HasFields(names_Values, [Ticket Assignee]))
in
    #"Filtered Rows1"

Edit3: измененный запрос:

Expression.Error: мы не можем преобразовать значение null в тип Record. Подробности: Значение = Тип = Тип

let
    names_Source = Excel.CurrentWorkbook(){[Name="namesTable"]}[Content],
    names_Values = Record.FromList(names_Source[Zendesk Name], names_Source[Zendesk Name]),


    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type datetime}, {"Ticket Assignee", type text}, {"# Solved", Int64.Type}}),
    #"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([Ticket Assignee] <> null)),
    #"Filtered Rows1" = Table.SelectRows(#"Filtered Rows", each Record.HasFields(names_Values, [Ticket Assignee]))
in
    #"Filtered Rows1"

Edit4: в моей таблице есть пустые значения, которые ошибочно принимались как пустые. Я добавил строку, чтобы отфильтровать нулевые значения из моего источника имен


person Douglas Gaskell    schedule 16.08.2016    source источник
comment
Не используйте names_Values = names_Source{1}, вместо этого используйте names_Value = Record.FromList(names_Source[Column1], names_Source[Column1]). Вы получили ошибку FieldSelector, потому что #"Filtered Rows1" относится к неправильной таблице: вы хотите фильтровать по #"Filtered Rows", а не по #"Changed Type"   -  person Alejandro Lopez-Lago - MSFT    schedule 17.08.2016
comment
@ AlejandroLopez-Lago-MSFT Ах, хороший улов по селектору полей. Я внес запрошенные вами изменения, теперь я получаю вторую ошибку We cannot convert the value null to type Text.. Есть ли способ отладить запрос, чтобы увидеть точную точку или поле сбоя? Еще раз, спасибо за помощь.   -  person Douglas Gaskell    schedule 17.08.2016


Ответы (2)


Если список элементов, которые вы хотите проверить, находится на листе Excel, вы можете импортировать таблицу с помощью From Table и использовать List.Contains, чтобы увидеть, находятся ли ваши значения в этой таблице. Если таблица рабочего листа находится в WorksheetQuery, а имена указаны в столбце Names, ваш шаг будет выглядеть так:

= Table.SelectRows(PreviousStep, each List.Contains(WorksheetQuery[Names], [Ticket Assignee]))

Если это окажется слишком медленным, вы можете попытаться преобразовать столбец в запись, а затем использовать вместо этого Record.HasFields.

person Alejandro Lopez-Lago - MSFT    schedule 17.08.2016
comment
Что бы WorksheetQuery было? Это импортированный диапазон или таблица, или вы действительно можете импортировать запросы в редактор запросов? Я создал таблицу и сослался на нее так: names_Source = Excel.CurrentWorkbook(){[Name=names]}[Content], names_Value = names_Source{0}[Value], какие дальнейшие шаги необходимо предпринять, чтобы поместить ее в фильтр указанным способом? - person Douglas Gaskell; 17.08.2016
comment
list.contains работает довольно медленно (он работает около 10 минут), и у меня есть данные всего за несколько дней (80 тыс. Строк). Пробовал маршрут Record.HasField, но в итоге получилась пустая таблица - person Douglas Gaskell; 17.08.2016
comment
WorksheetQuery - это любой запрос, созданный действием From Table. Как выглядит ваш запрос для Record.HasFields? Я конвертирую список с помощью Record = Record.FromList(names_Value, names_Value), затем использую Table.SelectRows(PreviousStep, each Record.HasFields(Record, [Ticket Assignee])). - person Alejandro Lopez-Lago - MSFT; 17.08.2016
comment
Я обновил свой вопрос своим текущим запросом. names_Values = names_Source{1}, выглядит записью, поэтому нет необходимости преобразовывать ее. Однако для удовольствия я преобразовал его в список, а затем обратно в запись, чтобы проверить и получить те же результаты. Я также добавил ошибки, которые получаю в данный момент. Спасибо за помощь. - person Douglas Gaskell; 17.08.2016

Почему бы не использовать операции соединения? Вроде как работает хоть не медленнее, а яснее, на мой взгляд:

let
    names_Source = Excel.CurrentWorkbook(){[Name="namesTable"]}[Content],
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Joind = Table.NestedJoin(Source,{"Ticket Assignee"},names_Source,{"Zendesk Name"},"NewColumn",JoinKind.RightOuter),
    Filtered = Table.RemoveColumns(Joind,{"NewColumn"})
in
    Filtered
person Max Zelensky    schedule 18.08.2016
comment
Определенно проще использовать операции соединения - вам вообще не нужно писать код, просто используйте кнопку слияния в пользовательском интерфейсе редактора запросов. - person Mike Honey; 25.08.2016