Power Query嵌套连接多匹配场景下,如何获取最大值及对应详情?
解决Power Query Left Outer Join后取最新匹配行的优雅方案
嘿,我刚好也踩过类似的坑,给你个更简洁的开箱即用解法,不用折腾分组去重那套繁琐操作:
核心思路就是在展开嵌套表之前,先对每个嵌套的Table2表筛选出c列最大值对应的完整行,这样展开后自然就不会出现重复的Table1行了。
具体步骤&优化后的M代码
let Source = Table.NestedJoin(Table1, {"a", "b"}, Table2, {"a", "b"}, "Table2", JoinKind.LeftOuter), // 对每个嵌套的Table2表,直接提取c列最大值对应的完整行 #"Get Latest Table2 Row" = Table.AddColumn(Source, "LatestTable2", each Table.Max([Table2], "c")), // 展开最新行的字段,替换成你实际需要的列名 #"Expanded Latest Table2" = Table.ExpandRecordColumn(#"Get Latest Table2 Row", "LatestTable2", {"c", "d", "e", "f"}, {"c", "d", "e", "f"}), // 可选:移除没用的嵌套表列 #"Removed Nested Column" = Table.RemoveColumns(#"Expanded Latest Table2", {"Table2"}), // 保留你原来的非空筛选逻辑 #"Filtered Rows" = Table.SelectRows(#"Removed Nested Column", each ([a] <> null)) in #"Filtered Rows"
为什么这个方法更优雅?
- 用Power Query内置的
Table.Max函数直接定位到每个分组的最大值行,完全是原生开箱即用的功能,不需要自己写复杂的分组逻辑 - 从根源上避免了重复行的产生,不需要后续再做去重操作,代码逻辑更清晰
- 完美保留Left Outer Join的特性:如果Table2没有匹配项,
Table.Max会返回null,展开后对应列会显示空值,完全符合你的需求
补充说明
如果你的“最新”判断不是基于数值大小,而是日期之类的字段,只需要把Table.Max([Table2], "c")里的"c"换成对应的日期列名就行,Table.Max会自动处理日期的先后比较。
内容的提问来源于stack exchange,提问作者mfaiz
相关产品推荐
相关产品推荐

