EBI智能数据分析俱乐部学员咨询一个数据排名问题,示例数据如下图:

【要求】
用公式计算选手排名,首先考虑正确答题数量,数量多者排名优先。如果选手正确答题数量相同,再考虑用时,用时短者排名优先。比如上图中,正确答题数量同时为20,用时最短的为第1名。
【解题思路】
这看起来就是一个简单的排名,普通排名可以用RANK函数。
因本题要求考虑答题数量和答题用时二个因素,而时间的本质就是数字,我们可以将答题数量减去答题时间作为排名的数据,在F6单元格输入公式:=C6-D6,如下图所示:

然后对辅助列“排名数据”进行排名,在G6单元格输入公式:=RANK(F6,$F$6:$F$25),就能得到正确的结果:

如果我们不用辅助列,直接使用公式,理论上用C6-D6作为第一参数(排名数据),用$C$6:$C$25-$D$6:$D$25作为第二参数(排名区域),在单元格H6输入公式:
=RANK(C6-D6,$C$6:$C$25-$D$6:$D$25)
结果无法输入,确认后提示公式错误:

我们分解公式步骤检查下:
1、选中C6-D6按F9,得到计算结果:19.1940162037037

2、选中$C$6:$C$25-$D$6:$D$25按F9,得到一组计算结果:

看来公式逻辑没有问题,问题出在RANK函数第二参数上:
事实上rank的第二个参数ref并不支持数组。
ref参数一般表示同时支持range(单个或连续区域引用)和合并区域(两个以上不连续区域引用的合集)为参数,这两种参数的都是引用类型。
但是有个特例,rank中的ref参数还支持连续跨多表的“三维引用”,如sheet1:sheet3!a1:a10.其他函数比如subtotal中的ref则并不支持连续跨多表的“三维引用”。应该特别指出的是,这个被我们习惯称为“三维引用”的东西,实际上并不是引用类型。真正的三维引用只有offset、indirect等引用函数才能够产生。
这样使用RANK函数是做不到一步解决,我们换个思路,用SUM函数。
在E2单元格输入如下公式并向下填充,结果完美解决:
=SUM(--($C$6:$C$25-$D$6:$D$25>C6-D6))+1

如果是Excel2019之前版本,要按Ctrl+Shift+Enter三键组合,完成运算
【公式解释】
$C$6:$C$25-$D$6:$D$25:将C6:C25数据区域的20位选手的正确答题数量,与其相应的用时相减,得到一组数据不重复的20个数据。
$C$6:$C$25-$D$6:$D$25>C6-D6:将20个不重复的数据,与第一位选手的答题数量与用时相减的结果比较,得到一组TURE或FALSE值,如下图:

--($C$6:$C$25-$D$6:$D$25>C6-D6):通过减负运算将20个TURE或FALSE值转变为1或0,如下图:

SUM(--($C$6:$C$25-$D$6:$D$25>C6-D6))+1:将20个1或0相加,再加1,即得排名。