有一次考试,我考了51分,在班里排第6名。当时,班里有7个人,大家的成绩是这样的(配套数据见文末):
虽然成绩不太理想,但是,我还是知道这个名次是怎么排出来的。
首先,老师把所有同学的成绩放到一起,并从高到底排列:
然后,大家的排名自然就一目了然了。简单的排名函数RANK.EQ就是这么设计的:
RANK.EQ ( 值, 列, 排序 )
其中,“值”就是数据列里要求排名的某个值(比如我的成绩51),“列”就是排名的列(比如这里的成绩列),排序即为排名的方式(升序还是降序)。
比如在成绩表里,做各位同学在班里的排名:
但是,这个设计有个很大的缺陷:
1、第1个参数“值”必须在排名的列里,比如我的成绩51在本班的成绩里;而51这个数,不在隔壁班的成绩单里,那就没办法参与隔壁班的成绩排名了;
2、第2个参数“列”意味着只能简单引用数据列,而你无法通过任何方式来修改这个列(比如进行一定程度的计算,或通过上下文来调整等等)
所以说,RANK.EQ这个函数虽然看起来比较简单直接,但是,功能有很大的限制,也不通用!
比如说,我们如果把咱们班同学的成绩拿到隔壁班去比一下,看都能排到第几名:
结果,只有静静的144分,因为刚好在隔壁班的成绩列里也有,所以得到了排名结果,其他人的成绩得到的排名结果都是空值。
那么,强大的排名函数RANKX,是怎么设计的呢?我们先来看一下它的参数:
RANKX ( 表, 公式 , 值 , 排序, 相等时处理方式 )
首先,这时一个“X”类函数,即会有迭代计算。而这,也正是RANKX函数的强大之处!
你可以按需要构造任何样子的“表”,然后通过第2个参数“公式”进行迭代计算出一列数,然后将第3个参数公式确定的“值”放到第2个参数得到的一列数里进行比对排名,而且约定,如果第3个参数用来确定值的公式跟第2个一样(多数情况下内部/本班排名),那么可以省略。
继续用前面的成绩数据,比如说,要求我在本班里的排名,用RANKX函数如下:
而这个公式求排名的过程如下图所示:
Step-01 构造表:全部姓名—— ALL(‘本班’[姓名]);
Step-02 对全部姓名进行迭代计算:取小值(对于每个人来说取大还是小都一样)并加CALCULATE函数——实现行上下文转换为筛选上下文,从而计算得到全部姓名所对应的成绩。
Step-03 看一下我们要用来计算排名的值是多少:比如这里只看我个人的成绩(51)——而这个计算的方法与参数2的一致,所以可以省略。
Step-04 拿第3歩确定的个人成绩(比如我的51分),放到第2步迭代计算得到的列里看看排在第几位。
接下来,我们再用把成绩拿到隔壁班去对比排名的例子进一步解析。
比如说,我的成绩不好,不好意思拿出去跟别人比,但是,咱们班的静静、阿美,很厉害啊!如果他们的成绩放到隔壁班去,是不是也很厉害,能排到第几名?
这个时候,公式该怎么写?又是怎么计算呢?比如,阿美135分,排第几名?
参考上面的过程,排名的过程是这样的:
更加具体一点儿,我们看阿美的135分,显然是在隔壁班第2名(144分)和第3名(124分)之间,所以,阿美应该能“挤进”第3名!
“挤进”——有点儿插队的意思。嗯,排名函数RANKX就是这样设计的,当某个参与排名的数据,不在排名参照的这一列数据里面时,就采用“插队”的形式,看能插入到哪个位置,从而得到排名结果!
这就是RANKX排名函数的核心原理——通过按需要构造表,按需计算得到排名参照的数据列,然后再按需要计算用于排名的值,最终确定在数据列里能排到哪个位置!
而“按需要”,就意味着:你可以——为所欲为!对此,我后面将进一步分享更多排名相关的例子,供大家学习巩固。
本文分享自 Excel到PowerBI 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!