1

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

表格1

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

我还有一张桌子:

表 2

deviceid
001
003
004 

现在我可以通过编写如下内容来过滤表 1 和表 2:

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

由于表2一直在变化,请问如何在power query下定义一个查询来实现这一点?

4

2 回答 2

1

听起来你想要一个反加入。

Table.JoinwithJoinKind.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 的“deviceid”列。

于 2015-05-29T05:33:06.000 回答
0

您可以使用 获取 Table2 的列 deviceid Table2[deviceid],它会为您提供一个列表。我们可以用 来检查当前的 deviceid 是否在列表中List.Contains,所以你的过滤器看起来像这样:

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

于 2015-05-28T18:33:14.233 回答