Power Query单列去重问题:如何独立清除各列重复值
实现Power Query单列独立去重的解决方案
嘿,我完全懂你的痛点——Power Query默认的「删除重复项」是按整行判断的,但你要的是每一列单独保留唯一值,还要和原始表保持依赖关系,同步更新。下面给你两种实用方法,不管是新手还是熟手都能用:
方法一:手动可视化操作(零代码,适合少量列)
- 先确保你的验证表是直接引用原始表的——比如通过「数据」→「获取数据」→「从表格/范围」加载原始表,或者右键原始表选「引用」,这样原始表改了,刷新验证表就同步。
- 处理单列去重:
- 选中你要去重的列,右键点它,选「删除重复项」——注意!只选中这一列的情况下,Power Query只会删掉该列的重复值,保留第一次出现的那条记录,其他列的内容跟着保留(其他列的重复不会被碰)。
- 如果你想让每列的唯一值单独成列展示(比如列A的所有唯一值占一列,列B的占另一列,行数可能不一样),可以这么做:
- 选中列,点「转换」→「提取」→「值」,先把列转成唯一值列表(或者先删重复项再提取值)。
- 每列都这么操作,得到几个独立的唯一值列表。
- 然后点「开始」→「追加查询」→「追加查询作为新查询」,把这些列表合并成表;或者用「添加列」→「自定义列」,把其他列的唯一值列表加进来。
方法二:M代码批量处理(适合多列,高效)
如果你的表有十几列甚至更多,手动点太麻烦,直接用M代码批量搞定:
- 打开Power Query编辑器,点击顶部的「高级编辑器」,把现有代码替换成下面这段(记得把
原始表改成你实际的原始表名称):
let // 引用你的原始表 Source = 原始表, // 获取所有列的名称 ColumnNames = Table.ColumnNames(Source), // 遍历每一列,提取该列的所有唯一值 UniqueColumns = List.Transform(ColumnNames, (col) => [ColumnName = col, UniqueValues = List.Distinct(Table.Column(Source, col))]), // 把处理后的列组合成最终的表 Result = Table.FromList(UniqueColumns, (x) => x[UniqueValues], ColumnNames) in Result
- 简单解释下:
List.Distinct是M语言里提取唯一值的核心函数,专门针对单列表去重。- 最终生成的表,每一列都是对应原始列的所有唯一值,行数是各列唯一值数量的最大值,缺的地方会自动填
null,完美满足每列独立去重的需求,而且原始表更新后,刷新就同步。
特殊需求:保留原始行结构,重复项转空白
如果你不想改变原始表的行数,只是把每列里重复出现的值改成空白(只留第一次出现的唯一值),可以用这段M代码:
let Source = 原始表, // 遍历每一列,把重复值替换为null TransformedColumns = Table.TransformColumns(Source, List.Transform(Table.ColumnNames(Source), (col) => {col, (values) => let UniqueList = List.Distinct(values), // 标记每个值的出现顺序,只保留第一次出现的 Result = List.Transform(values, (val) => if List.PositionOf(UniqueList, val) = List.PositionOf(values, val) then val else null) in Result})) in TransformedColumns
这段代码会让每列里第一次出现的唯一值保留,后面重复的都变成空白,同时完全保留原始表的行结构。
内容的提问来源于stack exchange,提问作者user2817017
相关产品推荐
相关产品推荐

