重复值查重与去重的三种姿势
一份名单里同一批客户被录了两次、同一个手机号对应两个名字——查重和去重是数据整理绕不开的一步。这篇讲三种做法,以及它们各自适合什么场合。
一、条件格式:只标记,不改数据
选中 A 列(或整个区域)→ 开始 → 条件格式 → 突出显示单元格规则 → 重复值。
默认把重复项标红。要只标"第二次及以后出现"(即保留第一条不标),用公式规则:
=AND($A2<>"",COUNTIF($A$2:$A2,$A2)>1)
关键在 $A$2:$A2 这个逐渐扩大的区域:判断第一条时只比第一行,判断第 10 条时比前 9 行,所以第一次出现不会被标。
这个规则的优点是完全不动原数据,适合先看清重复情况再决定怎么处理。
二、COUNTIF 定位:找出全部重复
在辅助列写:
=COUNTIF($A$2:$A$1000,A2)
结果是 1 表示唯一,大于 1 表示重复。配合筛选:
- 筛
>1:看到所有重复的记录; - 筛
=1:得到唯一的记录。
想直接写"是否重复":
=IF(COUNTIF($A$2:$A$1000,A2)>1,"重复","唯一")
COUNTIF 对文本不区分大小写(abc 和 ABC 算同一个),需要区分时用 EXACT:
=SUMPRODUCT(--EXACT($A$2:$A$1000,A2))
三、删除重复项:一键去重
数据 → 删除重复值 → 勾选用于判断的列。
要点:
- 可以多列组合判断,比如"姓名 + 手机号"一起相同才算重复;
- 默认保留第一次出现的记录,删除其后的;
- 操作不可撤销(撤销按钮是灰的),先复制一份工作表。
如果只想保留"金额最大的一条",删除重复项做不到。这时要按金额降序排,再删重复——排序后第一条就是最大的。
四、比"重复"更复杂的:模糊重复
现实里更难的是"张 三"和"张三 "、138-0013-8000 和 13800138000 这种。
先做清洗(见"文本清洗三件套"),再判重:
=IF(COUNTIF($A$2:$A$1000,TRIM(B2))>0,"重复","唯一")
再进一步是相似度匹配,比如"北京雅铭网络科技"和"雅铭网络"。Excel 没有内置相似度函数,可用 SEARCH 做包含判断:
=IF(SUMPRODUCT(--ISNUMBER(SEARCH($A$2:$A$100,B2)))>0,"疑似重复","新记录")
这把"旧名单里的值是否是待查值的一部分"作为判断,粒度粗但够用。真正要做相似度,得上 Power Query 的模糊合并或专门工具。
五、去重后统计
COUNTA / SUMPRODUCT 数不重复个数:
=SUMPRODUCT(1/COUNTIF($A$2:$A$100,$A$2:$A$100))
前提是区域内不能有空单元格,空值会让 COUNTIF 返回 0,引发除零错误。区域有空值时用:
=SUMPRODUCT(($A$2:$A$100<>"")/COUNTIF($A$2:$A$100,$A$2:$A$100&""))
365 版本直接 =COUNTA(UNIQUE(A2:A100)) 更清楚。
六、什么时候该用 Power Query
行数过万、需要每月重复做、要多表比对时,手工去重不是长久之计。Power Query 的做法:
- 数据 → 获取数据 → 从表格;
- 选中列 → 删除重复项;
- 关闭并上载。
以后源数据变了,右键刷新即可。判断要不要上 Power Query 的标准很简单:同一个操作这个月已经做过一次,下个月还要做。
七、常见坑
| 现象 | 原因 | 处理 |
|---|---|---|
| 明明不同却判为重复 | 有不可见空格 | 先 TRIM(CLEAN()) |
| 明明相同却不算重复 | 一个文本一个数值 | 统一类型 |
| 删除重复后行数没变 | 判断列勾错 | 重新勾选判断列 |
| 撤销按钮变灰 | 删除重复不可撤销 | 提前备份 |
| 去重后公式全乱 | 行被删除导致引用错位 | 先转值再做 |
八、速查
| 需求 | 做法 |
|---|---|
| 只看不改 | 条件格式 + =COUNTIF($A$2:$A2,$A2)>1 |
| 筛选全部重复 | 辅助列 =COUNTIF($A$2:$A$1000,A2) |
| 一键去重 | 数据 → 删除重复值(先备份) |
| 组合判断 | 删除重复时勾多列 |
| 统计唯一数 | =COUNTA(UNIQUE(A2:A100)) |
| 定期重复做 | Power Query |
去重之前先问一句:重复的那几条里,有没有该保留的信息?很多时候问题不是"去重",而是"该留哪条"——这一步机器替不了你。