筛选出前3名的记录,并按名次排序
小伙伴们,大家好。年根将近,你们是准备好过年了,还是被年过?
。无论如何,还是祝大家新年快乐。今天要分享的内容是从成绩表中筛选出前3名的记录,并按名次排序。来看下数据源和完成后的结果。下图左表是数据源,右表是完成后的效果。这里的排名是美式排名。
这个问题如果用基础操作来完成很简单,就是筛选,复制,粘贴,然后排序,如下图所示。
但是用基础操作不能实时更新,如果数据源改变,那么就要重新操作一遍。而用函数就会实时更新变化。虽然用函数会自动变化,但是实现起来还是有点难度的。关键的部分在于排序。
先来看下公式吧,在E2单元格输入公式=IFERROR(INDEX(A:A,MOD(SMALL(IF($C$2:$C$13<4,$C$2:$C$13/1%+ROW($2:$13)),ROW(A1)),100)),""),按ctrl+shift+enter三键结束,右拉下拉填充,完成。
=IF($C$2:$C$13<4,$C$2:$C$13/1%+ROW($2:$13))这部分返回的结果如下图D列所示。因为我们需要的是前3名的,所以if的第1参数用来判断排名小于4,如果成立的,返回对应的名次乘以100再加上对应的行号,比如第1名的傅彩薇,名次小于4,那么返回1*100+4,也就是104,否则名次不小于4的返回false。
这里关键的部分是$C$2:$C$13/1%+ROW($2:$13)这部分,让加权后的名次和行号组合起来,这样就可以按名次排名,并且可以找到对应名次的行号。比如第1名的傅彩薇返回104,第2名的何宏返回203。但104还是小于203,它们的大小顺序并没有改变,也就是组合后的数字没影响原来的排名大小。104的尾数4对应的就是行号。104的意思就是第1名的在第4行。
=SMALL(IF($C$2:$C$13<4,$C$2:$C$13/1%+ROW($2:$13)),ROW(A1))这部分就是用small提取上一步结果的第1个最小值104,下拉提取第2个最小值203,再下拉提取第3个最小值210,再下拉就出错。104,203,210就是第1名,第2名,第2名,这样就是按名次的顺序排序。
=MOD(SMALL(IF($C$2:$C$13<4,$C$2:$C$13/1%+ROW($2:$13)),ROW(A1)),100)这部分用mod除以100取余数,求出名次对应的行号。比如104除以100余数为4,也就是第1名在第4行,如下图红色箭头所示。接下来用index返回对应的单元格内容就可以了,最后用iferror处理一下错误值就ok了。就不详细截图说明了。
下面说两个不用按三键的公式,感兴趣的可以研究一下,都要用到mode.mult这个函数。
第1个公式为,=IFERROR(INDEX(A:A,MOD(SMALL(MODE.MULT(($C$2:$C$13>3)*{1,2}%+$C$2:$C$13/1%+ROW($2:$13)),ROW(A1)),100)),""),右拉下拉,完成。
第2个公式为=IFERROR(INDEX(A:A,MOD(TEXT(SMALL(MODE.MULT($C$2:$C$13/1%+ROW($2:$13)*{1,1}),ROW(A1)),"[<400];"),100)),""),
右拉下拉,完成。这个公式用text做条件判断,代替if的功能。
如果你有其他的方法,欢迎在留言区写出你的答案,让我们一起学习。
文件链接:
https://pan.baidu.com/s/1MDXm0Kt_EV-BjtSEmkiydg
提取码:z0s5