筛选出每个人最高分的记录(二)
大家好,关于昨天的问题,今天来说另外一种方法,主要用的是frequency和match函数。最近我挺喜欢用frequency的,尽管我对它的掌握是有限的。一题多解可以拓展思维,如果你有心想学函数,不妨尝试用多种方法来解决同一个问题,你会在不同的视角看到不同的风景。
筛选出每个人最高分的记录
下图左表是数据源,右表是要的效果,就是把每个人最高分的记录筛选出来。今天用frequency来完成一下,从另一个不同的角度来看待这个问题。

我们之前说过frequency和match结合可以提取不重复值,不仅可以顺序提取,而且可以倒序提取。其实这个题目也可以看作提取不重复值,只不过提取的方式既不是顺序,也不是倒序,而是按最高分来提取。所以我们只要把最高分的变为最小的,就能用frequency定位到它的位置,然后把它提取出来。今天的方法需要对frequency有一定的基础,否则无法理解。
说下公式吧,在E3单元格输入公式=INDEX(A:A,SMALL(IF(FREQUENCY(ROW(A:A),MATCH($A$3:$A$17,$A$3:$A$17,)+1-$B$3:$B$17%),ROW($3:$18),4^8),ROW(A1)))&"",按ctrl+shift+enter三键结束,向右向下填充,完成。
公式中关键的部分是frequency+match的那部分,剩余外层的就是一对多查询的套路。
=MATCH($A$3:$A$17,$A$3:$A$17,)这部分返回的结果如下图C列所示,就是用match查询所有姓名第1次出现的位置,这样相同姓名返回的位置是相同的,比如“郭恺强”对应的位置都是1。说白了,就是把相同的姓名转为相同的数字,方便frequency后续的处理。

=1-$B$3:$B$17%这部分返回的结果如下图D列所示,目的是为了将最高分变为最小的数,比如“郭恺强”的所有分数中最高分是96,经过上面的运算就把最高分96变为最小的0.04,相对于他的其他分来说的,比如95变为0.05,比0.04大。大数变小数的一种方法是用另一个数来减它们,比如一个3,一个5,3比5小。用10减3得到7,10减5得到5,7比5大。

=MATCH($A$3:$A$17,$A$3:$A$17,)+1-$B$3:$B$17%这部分将二者相加,相当于加权处理,把位置和分数结合起来,返回的结果如下图C列所示。比如“郭恺强”对应的所有数字中,都是以1开始的小数,而最小值1.04对应的分数就是他的最高分96,所以下一步就要用frequency定位到最小值1.04的位置。

=FREQUENCY(ROW(A:A),MATCH($A$3:$A$17,$A$3:$A$17,)+1-$B$3:$B$17%)这部分返回的结果如下图D列所示,可以看到它在每个人最高分的位置计数,其他位置都为0。这样就得到了我们想要的行号,所以下一步就用if返回对应的行号。

由于frequency返回的结果会比第2参数的数组元素多一个,比如最后的1048568,所以if返回的行号也要多选一个,由ROW($3:$17)改为ROW($3:$18)。剩下的步骤就是一对多查询的方法了,我就不再详细说明了。主要是想说明frequency+match的定位去重法。这里是定位筛选最高分,你也可以筛选最低分。
再说一下另一个公式,用的是countif动态区域去重法。在H3单元格输入公式=LOOKUP(,0/FREQUENCY(1,(COUNTIF($H$2:$H2,$A$3:$A$17)=0)*(MATCH($A$3:$A$17,$A$3:$A$17,)+1-$B$3:$B$17%)),A$3:A$17)&"",不用三键,向右向下填充,完成。
这个公式我就不再详细解释了,之前类似的用法也说过了,感兴趣的同学可以复习研究下。对于这个问题,如果你还有其他的方法,欢迎留言写出你的公式,让我们一起学习。
文件链接:
https://pan.baidu.com/s/1dZ9jDSsLLGzqcsYATq5ozg
提取码:r4qt
