【问题标题】:How to filter a column by a range with Power Query?如何使用 Power Query 按范围过滤列?
【发布时间】:2016-12-23 11:48:27
【问题描述】:

我想按一系列值过滤 Power Query 列。我看到我可以手动选择或取消选择列中的值,但我需要在工作表中已有的一系列值上自动执行此操作。

假设我要查询的表包含 100 个唯一名称。我只想导入与工作表中包含 20 个名称的列表匹配的行。

如何使用 Power Query 做到这一点?

编辑:我可以创建一个 Excel 函数,将名称列表连接成查询所需的格式,如下所示:(= Table.SelectRows(#"Changed Type", each ([Ticket Assignee] ="Name 1" or [Ticket Assignee] ="Name 2")))。但仍然需要一种从查询中引用它的方法。

编辑2:

我的查询:

这个错误是:

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:我的表有空值,错误为空。我添加了一行来过滤掉我的名字源中的空值

【问题讨论】:

  • 不要使用names_Values = names_Source{1},而是使用names_Value = Record.FromList(names_Source[Column1], names_Source[Column1])。您收到 FieldSelector 错误,因为 #"Filtered Rows1" 引用了错误的表:您要过滤 #"Filtered Rows",而不是 #"Changed Type"
  • @AlejandroLopez-Lago-MSFT 啊,字段选择器不错。我已经按照您的要求进行了更改,现在我收到了第二个错误,We cannot convert the value null to type Text.。有没有办法调试查询以查看确切的故障点或故障域?再次感谢您的帮助。

标签: excel powerquery


【解决方案1】:

如果您要检查的项目列表在 Excel 工作表中,那么您可以使用 From Table 导入表格并使用 List.Contains 查看您的值是否在该表格中。如果工作表表在 WorksheetQuery 中并且名称在名称列中,那么您的步骤将如下所示:

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

如果最终速度太慢,您可以尝试将列转换为记录,然后改用Record.HasFields。

【讨论】:

  • WorksheetQuery 会是什么?那是导入的范围或表,还是您可以将查询实际导入查询编辑器?我创建了一个表并像这样引用它:names_Source = Excel.CurrentWorkbook(){[Name=names]}[Content], names_Value = names_Source{0}[Value], 需要采取哪些后续步骤才能以所示方式将其放入过滤器?
  • list.contains 非常慢(它已经运行了大约 10 分钟),而且我只有几天的数据(80k 行)。尝试了 Record.HasField 路由,但结果是一个空白表
  • WorksheetQuery 是 From Table 操作创建的任何查询。对于 Record.HasFields,您的查询看起来如何?我使用Record = Record.FromList(names_Value, names_Value) 转换列表,然后使用Table.SelectRows(PreviousStep, each Record.HasFields(Record, [Ticket Assignee]))。
  • 我已经用我当前的查询更新了我的问题。 names_Values = names_Source{1}, 似乎是一条记录,因此无需转换它。但是,对于踢球,我确实将其转换为列表,然后返回记录只是为了测试并得到相同的结果。我还添加了我目前收到的错误。感谢您迄今为止的帮助。
【解决方案2】:

为什么不使用连接操作?在我看来,它似乎至少不会变慢,但更清晰:

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

【讨论】:

  • 使用联接操作肯定更容易——您根本不需要编写任何代码,只需使用查询编辑器 UI 中的 Merge 按钮即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
相关资源
最近更新 更多