(烧脑!)按多关键字排序后求各名次对应的姓名
问:怎么查找第一名对应的姓名?名次的确定是先看语文的分数,语文分数高的排名靠前,如果语文分数相等,则要看总分,总分大的排名靠前。结果如G列所示,由于他只问第一名的姓名,F列和G列是我自己模拟的结果。
其实这个问题是按多关键字排序后求名次对应的姓名。就是以语文为第一关键字,总分为第二关键字降序排序,排序后的名字就是1,2,3,4,5,6名对应的姓名。举例说明一下,首先看语文的分数,最高的有2个,小明和王五,都是99分。现在确定不了谁是第1名,谁是第2名。还要看总分,小明的总分是197,王五的总分是187。总分高的排名靠前,所以小明是第1名。
用排序操作很简单,点2下就ok了。但是用函数完成还是有一定的困难,讲解也不好讲解。先把公式放出来=IFERROR(INDEX(A:A,100-MOD(LARGE(B$3:B$8/1%%%+D$3:D$8/1%-ROW($3:$8),ROW(A1)),100)),""),按ctrl+shift+enter三键,向下填充。
B$3:B$8/1%%%+D$3:D$8/1%这部分是为了实现双关键字排序。语文成绩扩大10万倍,加上总分扩大100倍,总分扩展100倍以后还不足以影响语文扩大10万倍后的大小顺序。这样不好理解,还是举例说明。
以老王和李四为例,老王语文92,总分184;李四语文88,总分187。肯定是老王的排名靠前,这个没有疑问吧。老王扩展后得到的数字是92018400,李四扩展后得到的数字是88018700。尽管李四的总分大于老王的,但最后还是老王的数字比李四的大。也就是说当语文成绩不相同时,最后的排名大小还是靠语文成绩决定的,这就符合了语文成绩为第1关键字。
再看两个语文成绩相同的例子,小明和王五。小明语文99,总分197;王五语文99,总分187。扩大后的数字分别为99019700,99018700。此时语文成绩相同,排名的大小主要看总分的大小,由于小明的总分高,所以最后小明的数字大于王五的数字。这样就符合了当语文成绩相同时,以总分为第二关键字排序。
B$3:B$8/1%%%+D$3:D$8/1%-ROW($3:$8)这部分是在上一步的基础上减去对应的行号。这一步也是挺重要的,有2个作用,第一个作用就是当语文成绩和总分都相同时,按名字出现的先后顺序排名。假如现在王五的总分改为197,那么他和小明的语文和总分都相同。此时由于小明是先出现的,所以小明的排名比王五靠前。第二个作用是为了后面返回对应的行号。
=LARGE(B$3:B$8/1%%%+D$3:D$8/1%-ROW($3:$8),ROW(A1))这部分就是将上面扩展后再减去行号的数字从大到小的提取出来。
=MOD(LARGE(B$3:B$8/1%%%+D$3:D$8/1%-ROW($3:$8),ROW(A1)),100)这部分是将上一步的数字除以100求余数。为什么要除以100呢?因为总分那里是扩大100倍。
=100-MOD(LARGE(B$3:B$8/1%%%+D$3:D$8/1%-ROW($3:$8),ROW(A1)),100)这一步是用100减去上一步的余数,得到了排名对应的行号。
=INDEX(A:A,100-MOD(LARGE(B$3:B$8/1%%%+D$3:D$8/1%-ROW($3:$8),ROW(A1)),100))这部分就是用index返回对应的姓名。下拉太多的话会出错,最外层用iferror处理错误值。
我觉得还是有点难理解的,大家可以自己下载文件动手做几次会比较容易理解。
练习文件链接:
https://pan.baidu.com/s/1d4bQENVeFYdAUNOAvabIDQ
提取码:w8m1