数据需要动态去重复,用UNIQUE函数就对了

职场   2024-12-13 07:55   福建  
HI,大家好,我是星光。

话说绝大部分语言都会提供专门删除数据重复项的函数,比如SQL的DISTINCT等,但Excel工作表函数在相当长一段时间内都没有……

数据去重复是工作表函数长久以来的痛点之一,为了解决这个问题,前辈们煞费苦心,钻研各种套路,但最终成型的公式要么复杂,要么效率低下,所以一旦有人询问大量数据动态去重复的问题,会函数的那人往往脸一拉,手一抬——你用透视表吧。


我举个例子。

下图所示是一张成绩表,A-E列分别是班级、组、姓名、科目、成绩等信息,部分字段存在重复值,现在需要在G列获取不重复的姓名名单。


在低版本表格中,有两种函数套路解决这个问题。


解法1:错位引用法 

=INDEX(C:C,MATCH(0,COUNTIF(G$1:G1,C$2:C$37),)+1)


解法2:万金油套路 

=INDEX(C:C,SMALL(IF(MATCH(C$2:C$37&"",C$2:C$37&"",0)=ROW($1:$36),ROW($2:$37)),ROW(A1)))


解法1用到了COUNTIF函数,公式看起来比较简洁,但数据量稍大运算效率就断崖式下滑。


解法2呢?你也看出来,公式很烦琐,编写调试都不容易,最终运算效率也不高。


这还只是单列数据去重复,如果需要班级、小组、姓名三列同时去重复呢?



打个响指,事已至此——前戏就铺的差不多了


这事如果你的Excel版本是2021+,又或者WPS,使用UNIQUE简直不要太简单。


G2单元格输入以下公式即可▼


=UNIQUE(C2:C37)
该函数可以返回数据源唯一值列表,按照动态数组的规则,会自动将6个结果依次显示在G2:G7单元格区域中。



而如果需要班级、小组、姓名三列同时去重复呢?


可以使用以下公式▼


=UNIQUE(A2:C37)


……


作为一个有经历的函数老人,事情解决的如此简单,我一时间也不知道该说什么好。


……


还是聊一下UNIQUE的语法。


=UNIQUE(数据源,[去重方向],[是否返回只出现1次的项])


它有三个参数,第2、3参数都是可选的。第2参数指定了去重的方向,是按还是按去重,FALSE代表行,TRUE代表列,默认是行。第3参数也是一个逻辑值,如果是FALSE,则返回唯一值列表;如果是TRUE,则返回只出现1次的数据。


关于2、3参数,我分别举一个例子,你看一下也就明白了。



按列方向去重



如下图所示数据为例,需要在G列统计不重复的人名,并按逗号作为分隔符合并。


G2单元格输入以下公式,并向下复制填充:

=TEXTJOIN(",",1,UNIQUE(B2:F2,1))

UNIQUE(B2:F2,1)获取B2:F2单元格区域的唯一值,这是一个单行区域,需要按不同列去重,因此第2参数设置为1,也就是TRUE。


最后再使用TEXTJOIN函数将唯一值合并为一个字符串即可。

……


获取只出现一次的数据


如下图所示数据为例,需要在C列统计A列只出现1次的人员名单。


注意这儿指的是只出现1次,而不是唯一值。比如'二肥'这个人名出现了很多次,太油腻,就不符合计算规则,不应出现在C列的结果表里。

C2单元格公式如下▼

=UNIQUE(A2:A17,0,1)

第3参数为1,等同逻辑值TRUE,表示统计只出现1次的数据。


是不是很简单?

……


综合小案例


很多时候去重不只是结果,还有可能是过程,不然你大可不必用函数,基操去除重复项就可以了。

我举2个例子。


▎1:中式排名

如下图所示的数据为例,需要在C列计算中式排名。


所谓中式排名也就是不重复计数,统计大于指定值的不重复的个数

常规函数解法如下▼


解法1:数组+倒数运算: ▼

=SUMPRODUCT((B$2:B$12>=B2)/COUNTIF(B$2:B$12,B$2:B$12))


而如果使用UNIQUE函数就很简单明了了


解法2:UNIQUE函数 ▼

=SUM((UNIQUE(B$2:B$12)>B2)*1)+1


UNIQUE(B$2:B$12)返回B2:B12区域唯一值列表,然后和B2作比较,如果大于B2则返回TRUE,否则返回FALSE,乘1后逻辑值转换为数值,再用SUM求和,最后加1即为结果。


除此之外,也可以使用以下公式:


解法3:动态数组

=MATCH(B2:B12,SORT(UNIQUE(B2:B12),1,-1),0)


使用SORT函数对UNIQUE返回的唯一值列表降序排列,再用MATCH函数查询B列成绩在该结果中首次出现的序列号,也就是中式排名的结果。



▎2:非重复计数


如下图所示,A:B列是数据源,需要统计不同班级不重复的人数,也就是通常所说的按条件去重复计数。


常规函数解法如下▼


解法1:数组公式: ▼

=COUNT(0/(

    MATCH(D2&B$2:B$11,A$2:A$11&B$2:B$11,0)

    =ROW($1:$10)

))


而如果使用UNIQUE函数就很简单明了了


解法2:UNIQUE函数 ▼

=COUNT(0/LEN(

    UNIQUE(FILTER(B$2:B$11,A$2:A$11=D2))

))


FILTER筛选出A列班级等于D2指定班级的B列的人名,UNIQUE对此去重,再用COUNTA统计去重后的个数。


这里可以思考一下,我为什么没有直接使用COUNT(UNIQUE)),而且增加了一个LEN函数嵌套呢?是因为凑字数吗?


……


摊手,没了,今天分享的内容就这样。有啥问题可以在VIP会员群中提问交流,右下角点个赞,咱们下期再见。



案例文件下载百度网盘..▼

https://pan.baidu.com/s/1NqmPfFo8vkdG3HvFvwQGdg 

提取码: wpvw




>需要系统学习Excel,却找不到优质教程?学习Excel的过程中遇到疑难问题,却找不到人及时作出解答?

加入我的付费社群,学习+训练+答疑,与5000+在线会员一起,同微软最有价值专家MVP同行,全面精进Excel之道

🚂>>~
加入我的付费会员,全面学习Excel
透视表 函数 图表 VBA PQ想学啥学啥
👀


本文由公众号“Excel星球”首发。

点击阅读原文系统学习Excel!

Excel星球
微软全球最有价值专家(Excel MVP),上千篇原创图文和视频教程随学随用,随用随查,建议常用Excel的职场人关注。
 最新文章