我想通过使用另一个表中的列来过滤一个表。这是我要过滤的表格:
表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一直在变化,如何在电源查询下定义查询以实现此目的?
答案 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]))