Power BI中用M代码创建返回特定值最早日期的新列
在Power Query中为每个AccountID添加最早ApprovalDate列
针对你的大表场景,推荐用分组后合并的方法,性能更优,避免超时问题,具体实现如下:
方法一:分组聚合+合并(适合大表,性能友好)
先按AccountID分组计算每个ID的最早审批日期,再将结果合并回原表,这种方式仅需扫描表两次,远优于逐行扫描的方法:
let 源 = 你的原表, // 替换成实际的数据源引用 // 按AccountID分组,聚合取最小的ApprovalDate 分组计算最早日期 = Table.Group(源, {"AccountID"}, {{"最早审批日期", each List.Min([ApprovalDate]), type date}}), // 将分组结果与原表左连接,匹配AccountID 合并原表与分组结果 = Table.NestedJoin(源, {"AccountID"}, 分组计算最早日期, {"AccountID"}, "临时分组数据", JoinKind.LeftOuter), // 提取最早审批日期列并清理临时列 提取目标列 = Table.ExpandTableColumn(合并原表与分组结果, "临时分组数据", {"最早审批日期"}, {"最早审批日期"}), // 可选:调整新列的位置(这里插入到原表第3列,可按需修改) 调整列顺序 = Table.ReorderColumns(提取目标列, List.InsertRange(Table.ColumnNames(源), 2, {"最早审批日期"})) in 调整列顺序
方法二:添加自定义列(适合小表,写法简洁)
如果数据量不大,也可以直接在自定义列中筛选当前AccountID的所有行并取最小日期,但大表不推荐(逐行扫描会导致超时):
let 源 = 你的原表, 添加最早日期列 = Table.AddColumn(源, "最早审批日期", (当前行) => List.Min(Table.SelectRows(源, (行) => 行[AccountID] = 当前行[AccountID])[ApprovalDate]), type date) in 添加最早日期列
关于你之前尝试的问题说明
List.Generate主要用于生成自定义序列,用来处理分组取最小值属于误用,写法不当会导致不必要的循环,进而引发超时。- 单独用
List.First无法按AccountID分组筛选,必须结合分组逻辑才能得到每个ID的最早日期,直接使用自然会出现语法或结果错误。
内容的提问来源于stack exchange,提问作者KevinR
相关产品推荐
相关产品推荐

