如何在Power Query中添加动态过滤器

时间:2015-05-28 16:57:46

标签: excel filter powerquery

我想通过使用另一个表中的列来过滤一个表。这是我要过滤的表格:

表1

deviceid, user_number  
001,400
002,500
003,600
004,700
009,1000

我有另一张桌子:

表2

deviceid
001
003
004 

现在我可以通过写下这样的东西来过滤表1:

"Filtered Rowxx" = Table.SelectRows(#"Column1", each ([deviceid] <> "001" 
and [deviceid] <> "003" and [deviceid] <> "004")

由于表2一直在变化,如何在电源查询下定义查询以实现此目的?

2 个答案:

答案 0 :(得分:1)

听起来你想要一个反连接。

带有Table.Join

JoinKind.LeftAnti会过滤掉左表中与右表匹配的行。

let
    Column1= #table({"deviceid", "user_number"}, { {"001", "400"}, {"002", "500"}, {"003", "600"}, {"004", "700"}, {"009", "1000"} }),
    Table2 = #table({"__deviceid"}, { {"001"}, {"003"}, {"004"} }),

    AntiJoin = Table.Join(#"Column1", "deviceid", Table2, "__deviceid", JoinKind.LeftAnti),
    SelectColumns = Table.SelectColumns(AntiJoin, {"user_number", "deviceid"})
in
    SelectColumns

Table.Join的一个好处是它可能会将您的过滤器折叠到支持关系数据库服务器,而列表操作往往不会折叠。 (但是如果你的查询运行得很快,那真的不重要。)

Table.Join的一个问题是它无法处理多个具有相同名称的列,因此我必须重命名Table2&#34; deviceid&#34;列。

答案 1 :(得分:0)

您可以使用Table2[deviceid]获取Table2的列deviceid,它会为您提供一个列表。我们可以使用List.Contains检查当前的deviceid是否在列表中,因此您的过滤器可能如下所示:

"Filtered Rowxx" = Table.SelectRows(#"Column1", each not List.Contains(Table2[deviceid], [deviceid]))

相关问题