Office 365函数新世界 :计算不重复数

数据去重复是工作表函数长久以来的痛点之一,为了实现这个功能,前辈们煞费苦心,钻研各种套路,但最终成型的公式要么复杂要么效率低下,所以一旦有人询问大量数据动态去重复的问题,会函数的那人往往脸一拉,手一抬——你用透视表吧。
我举个例子。
下图所示是一张成绩表,A-E列分别是班级、组、姓名、科目、成绩等信息,部分字段存在重复值,现在需要在G列获取不重复的姓名名单。
有两种函数套路解决这个问题。
解法1:错位引用法 ▼
G2=INDEX(C:C,MATCH(0,COUNTIF(G$1:G1,C$2:C$37),)+1)
解法2:万金油套路 ▼
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简直不要太简单。
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次的数据。
是不是很简单?
……
综合小案例
很多时候去重不只是结果,还有可能是过程。
我举个例子。
如下图所示的数据为例,需要在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,SORT(UNIQUE(B2:B12),1,-1),0)
使用SORT函数对UNIQUE返回的唯一值列表降序排列,再用MATCH函数查询B列成绩在该结果中首次出现的序列号,也就是中式排名的结果。
这里我们用了一个陌生的函数:SORT。它的主要作用是排序,这是我们下一章要聊的主题函数。
白鹤亮翅,打完收工。咱们下期再见,不见不散。
案例文件下载百度网盘..▼
https://pan.baidu.com/s/1NqmPfFo8vkdG3HvFvwQGdg
图文制作:看见星光
原载公众号:Excel星球
(0)

相关推荐