PowerQuery:按特定条件删除重复行并保留首个条目
问题解决方案
一、修复Ron Rosenfeld方案中的数据类型错误
你遇到的数据类型错误,根源是生成ShiftedStatus列时错误引用了数值类型的Version列,而该列需要对应文本类型的状态字段StatutModifié。修改后的代码如下:
#"Colonnes groupées" = Table.Group(#"Minimal", {"ID"}, { {"Filtered", (t)=> let sorted = Table.Sort(t,{{"Version", Order.Descending}}), shifted = Table.FromColumns( Table.ToColumns(sorted) & {List.RemoveFirstN(sorted[StatutModifié],1) & {null}}, type table[ID=number, Version=number, ModificationDateTime=datetime, StatutModifié=text, ShiftedStatus=text]), deleteRows = Table.SelectRows(shifted, each [ShiftedStatus] = null or not Text.Contains([ShiftedStatus], [StatutModifié], Comparer.OrdinalIgnoreCase)) in deleteRows, type table[ID=number, Version=number, ModificationDateTime=datetime, StatutModifié=text]} }), #"Expanded" = Table.ExpandTableColumn(#"Colonnes groupées", "Filtered", {"Version","ModificationDateTime","StatutModifié"}) in #"Expanded"
关键修改点:
- 将
t[Version]替换为sorted[StatutModifié],确保ShiftedStatus列与StatutModifié列数据类型一致 - 调整
Text.Contains的逻辑:原代码会保留状态未变化的行,若要保留状态变更的首个条目,需用not Text.Contains过滤掉与上一状态重复的行
二、用Table.Buffer优化性能
针对Davide Bacci方案的慢速度问题,Table.Buffer可以将表格数据缓存到内存,减少重复读取/计算,尤其适合SharePoint这类外部数据源。具体用法:
- 缓存整个源表格(分组操作前):
#"Buffered Table" = Table.Buffer(#"Minimal"), #"Colonnes groupées" = Table.Group(#"Buffered Table", {"ID"}, { ... })
- 缓存分组内的子表格(分组函数内部):
{"Filtered", (t)=> let bufferedT = Table.Buffer(t), sorted = Table.Sort(bufferedT,{{"Version", Order.Descending}}), ... in deleteRows, ...}
缓存后,Power Query无需反复从SharePoint拉取数据,300行的处理速度会大幅提升。
补充提示
- 确保
Version列的排序逻辑与状态变更时间一致,这样状态变更的顺序判断才准确 - 若状态是严格匹配(无模糊需求),可以用
[StatutModifié] <> [ShiftedStatus]替代Text.Contains,进一步提升性能
内容的提问来源于stack exchange,提问作者Ge0
相关产品推荐
相关产品推荐

