数据去重复是工作表函数长久以来的痛点之一,为了实现这个功能,前辈们煞费苦心,钻研各种套路,但最终成型的公式要么复杂要么效率低下,所以一旦有人询问大量数据动态去重复的问题,会函数的那人往往脸一拉,手一抬——你用透视表吧。下图所示是一张成绩表,A-E列分别是班级、组、姓名、科目、成绩等信息,部分字段存在重复值,现在需要在G列获取不重复的姓名名单。
G2=INDEX(C:C,MATCH(0,COUNTIF(G$1:G1,C$2:C$37),)+1)
G2=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呢?你也看出来,公式很烦琐,编写调试都不容易,最终运算效率也不高。这还只是单列数据去重复,如果需要班级、小组、姓名三列同时去重复呢?
打个响指,事已至此——前戏就铺的差不多了。
这事如果使用365新函数UNIQUE简直不要太简单。该函数可以返回数据源唯一值列表,按照动态数组的规则,会自动将6个结果依次显示在G2:G7单元格区域中。
……
作为一个有经历的函数老人,事情解决的如此简单,我一时间也不知道该说什么好。=UNIQUE(数据源,[去重方向],[是否返回只出现1次的项])它有三个参数,第2、3参数都是可选的。第2参数指定了去重的方向,是按行还是按列去重,FALSE代表行,TRUE代表列,默认是行。第3参数也是一个逻辑值,如果是FALSE,则返回唯一值列表;如果是TRUE,则返回只出现1次的数据。关于2、3参数,我分别举一个例子,你看一下也就明白了。如下图所示数据为例,需要在G列统计不重复的人名,并按逗号作为分隔符合并。=TEXTJOIN(',',1,UNIQUE(B2:F2,1))
UNIQUE(B2:F2,1)获取B2:F2单元格区域的唯一值,这是一个单行区域,需要按不同列去重,因此第2参数设置为1,也就是TRUE。最后再使用TEXTJOIN函数将唯一值合并为一个字符串即可。如下图所示数据为例,需要在C列统计A列只出现1次的人员名单。注意这儿指的是只出现1次,而不是唯一值。比如'二肥'这个人名出现了很多次,太油腻,就不符合计算规则,不应出现在C列的结果表里。第3参数为1,等同逻辑值TRUE,表示统计只出现1次的数据。所谓中式排名也就是不重复计数,统计大于指定值的不重复的个数。
=SUMPRODUCT((B$2:B$12>=B2)/COUNTIF(B$2:B$12,B$2:B$12))
=SUM((UNIQUE(B$2:B$12)>B2)*1)+1
UNIQUE(B$2:B$12)返回B2:B12区域唯一值列表,然后和B2作比较,如果大于B2则返回TRUE,否则返回FALSE,乘1后逻辑值转换为数值,再用SUM求和,最后加1即为结果。
=MATCH(B2,SORT(UNIQUE(B2:B12),1,-1),0)
使用SORT函数对UNIQUE返回的唯一值列表降序排列,再用MATCH函数查询B列成绩在该结果中首次出现的序列号,也就是中式排名的结果。这里我们用了一个陌生的函数:SORT。它的主要作用是排序,这是我们下一章要聊的主题函数。https://pan.baidu.com/s/1NqmPfFo8vkdG3HvFvwQGdg