Power Query按ID筛选最大日期行后关联查询运行极慢求助
问题原因分析与优化方案
性能问题核心原因
- 原有代码属于逐行嵌套迭代逻辑:每处理QueryB的1行数据,都需要重新遍历整个13万行的QueryB表,筛选同ID的所有行再计算最大日期,时间复杂度为O(n²),13万行的场景下会产生超100亿次重复计算,直接导致内存溢出、运行超时。
- 该写法无法触发Power Query的查询优化机制,每一次嵌套的
Table.SelectRows都会生成临时子表,大量临时数据堆积占用内存。
最优修改方案
推荐两种经过验证的高效实现,时间复杂度均为O(n),处理13万行数据耗时不会超过10秒:
方案1:分组取最大行(兼容性最好,结果最稳定)
先按ID分组,每个分组直接取日期最大的1行记录,再展开即可:
// 按ID分组,每组取Date最大的行记录 FilterOutDups = Table.Group(PriorStep, {"ID"}, {{"MaxDateRow", each Table.Max(_, "Date"), type record}}), // 展开记录的所有列,无需手动指定列名 ExpandMaxRow = Table.ExpandRecordColumn(FilterOutDups, "MaxDateRow", Table.ColumnNames(PriorStep))
方案2:排序后去重(代码最简洁,运行速度最快)
先按ID升序、日期降序排序,此时每个ID的第一行就是日期最大的行,直接按ID列去重即可:
#"按ID与日期排序" = Table.Sort(PriorStep,{{"ID", Order.Ascending}, {"Date", Order.Descending}}), FilterOutDups = Table.Distinct(#"按ID与日期排序", {"ID"})
额外优化建议
- 去重处理前可先删除QueryB中后续关联不需要的冗余列,进一步减少数据处理量
- 可以先单独运行去重后的QueryB查询确认结果正常,再和QueryA做关联,避免关联时重复计算去重逻辑
内容的提问来源于stack exchange,提问作者user11632362
相关产品推荐
相关产品推荐

