2016-08-16 2 views
0

Я хочу фильтровать столбец 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: We expected a FieldsSelector value.

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: We cannot convert the value null to type Record. Details: Value= Type=Type

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" 

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

+1

Не используйте 'names_Values ​​= names_Source {1}', вместо того, чтобы использовать 'names_Value = Record.FromList (names_Source [Column1] , names_Source [Column1]) '. У вас есть ошибка FieldSelector, потому что '#" Filtered Rows1 "' относится к неправильной таблице: вы хотите фильтровать на '#" Filtered Rows "', а не на '#" Измененный тип "' –

+0

@ AlejandroLopez-Lago-MSFT Ah, хороший улов на полевом селекторе. Я внес изменения, которые вы запросили, теперь я получаю 2-ю ошибку: 'Мы не можем преобразовать значение null в тип Text.'. Есть ли способ отладить запрос, чтобы увидеть точную точку или область отказа? Снова, спасибо за помощь. –

ответ

1

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

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

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

+0

Что будет «WorksheetQuery»? Является ли это импортированным диапазоном или таблицей или вы можете импортировать запросы в редактор запросов? Я создал таблицу и назвал ее так: 'names_Source = Excel.CurrentWorkbook() {[Name = names]} [Content], names_Value = names_Source {0} [Value],' какие следующие шаги необходимы для получения что в фильтр указанным образом? –

+0

«list.contains» довольно медленный (он работает в течение ~ 10 минут), и у меня есть только данные за несколько дней (строки 80k). Пробовал запись.HasField, но закончил с пустой таблицей –

+0

WorksheetQuery - это любой запрос, созданный в результате действия From Table. Для Record.HasFields, как выглядит ваш запрос? Я конвертирую список с помощью «Record = Record.FromList (names_Value, names_Value)», затем используйте «Table.SelectRows» (PreviousStep, каждый Record.HasFields (Record, [Assignee Ticket])). –

0

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

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 
+0

Определенно проще использовать операции объединения - вам вообще не нужно писать какой-либо код, просто используйте кнопку «Слияние» в пользовательском интерфейсе редактора запросов. –

Смежные вопросы