【问题标题】:How to add dynamic filter in Power Query如何在 Power Query 中添加动态筛选器
【发布时间】:2015-05-29 13:33:06
【问题描述】:

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

表 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下定义一个查询来实现这一点?

【问题讨论】:

    标签: excel filter powerquery


    【解决方案1】:

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

    Table.JoinJoinKind.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”列。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的回答!@Alejandro Lopez-Lago - MSFT,我今天尝试了这个,因为我的表 1 有超过 200 000 行,因此执行查询需要很长时间并最终得到一个错误:无法加载到数据模型中。你知道任何其他方式来实现这一点,提前谢谢
      • 实际上我在徘徊是否有一个从列创建过滤器字符串的函数,---------就像从表1设备ID列创建一个字符串,[deviceid] "001" 和 [deviceid] "003" 和 [deviceid] "004"
      猜你喜欢
      • 2022-01-20
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 2022-06-11
      • 2019-03-16
      • 1970-01-01
      相关资源
      最近更新 更多