
排名这件事看起来简单真到用的时候才发现坑不少。我见过太多人拿到销售数据、成绩单或者绩效表第一反应就是手动排序然后填个1、2、3结果数据一更新排名全乱套。也有人用了RANK函数却发现两个并列第一后面直接跳到第三名跟业务方要求的“并列第一后面应该是第二”完全对不上。更别提还要按部门分组排名、按多个条件综合排名这些进阶需求了。这篇内容就是来解决这些实际问题的。我会从RANK函数最基本的用法讲起把它的三个参数掰开揉碎说清楚然后重点讲几种高频场景下的排名方案怎么处理并列排名、怎么做分组排名、怎么实现多条件综合排名、怎么做出不随筛选变化的动态排名。每个方案我都会给出可直接复制的公式并解释公式背后的逻辑让你不仅会抄还能根据实际情况改。不管你是刚接触Excel函数的新手还是已经用了几年但总觉得排名这块不够顺手的老手应该都能从里面找到能直接用的东西。1. RANK函数到底怎么用三个参数决定一切1.1 先搞清楚RANK在算什么RANK函数的核心逻辑非常直白给你一个数字再给你一组数字它告诉你这个数字在这组数字里排第几。语法是RANK(number, ref, [order])三个参数各司其职。number你要排名的那个数字通常是对应单元格的引用。ref排名所依据的数字区域也就是“跟谁比”。order排序方式0或者省略表示降序大的排前面非零值表示升序小的排前面。举个最直观的例子。假设A列是十个销售人员的业绩额你想在B列显示每个人的业绩排名B2的公式就是RANK(A2, $A$2:$A$11, 0)这里$A$2:$A$11用了绝对引用目的是往下拖拽公式时比较区域始终锁定在这十个数字上不会跟着偏移。这是RANK函数最容易出错的地方之一——很多人写公式时用了相对引用往下拖之后比较区域越来越小排名结果自然全错。注意RANK函数在Excel 2010及以后版本中属于兼容性函数微软推荐使用RANK.EQ或RANK.AVG替代。但RANK仍然可以正常使用且在很多老版本文件中更常见。RANK.EQ的行为和RANK完全一致RANK.AVG则在遇到并列时返回平均排名后面会详细讲。1.2 升序还是降序order参数的实际影响order参数虽然只有两个取值方向但实际业务中搞反的情况非常多。我总结了一个简单的判断方法问自己“第一名应该是最大的数还是最小的数”。销售额、利润、得分、产量——第一名是最大的数用降序order填0或省略。完成时间、耗时、成本、误差值——第一名是最小的数用升序order填1。排名次本身没有“越大越好”或“越小越好”的绝对标准完全取决于业务定义。比如跑步比赛的成绩用时越短排名越靠前公式就是RANK(B2, $B$2:$B$11, 1)。而如果是一百米比赛的得分得分越高排名越靠前公式就是RANK(B2, $B$2:$B$11, 0)。同一个场景指标不同order参数就不同。我个人的习惯是不管降序还是升序都把order参数显式写出来不省略。这样做的好处是几个月后回头看公式一眼就知道当时的排序逻辑不用去猜。1.3 绝对引用一个字母之差导致的全盘错误前面提到了绝对引用这里再展开说一下因为这是RANK函数最高频的错误来源。假设你的数据在A2:A11你在B2写公式RANK(A2, A2:A11, 0)然后往下拖到B11。B2的比较区域是A2:A11B3的比较区域变成了A3:A11B4变成了A4:A11……最后一个B11的比较区域只有A11一个单元格排名结果全是1。这就是相对引用在拖拽时的“漂移”效应。正确的做法是用$A$2:$A$11锁定行列或者用$A$2:$A$11的混合引用形式如果只是纵向拖拽锁定行号即可即A$2:A$11。但为了保险起见我建议直接锁定整个区域避免横向拖拽时再出问题。如果你用的是Excel表格CtrlT转换的超级表引用会自动变成结构化引用比如RANK([业绩], [业绩], 0)这种情况下不需要手动加$符号表格会自动处理区域的扩展和锁定。这也是我推荐大家尽量用超级表管理数据的原因之一。2. 并列排名怎么处理RANK.EQ、RANK.AVG和COUNTIF的三套方案2.1 并列排名的三种业务口径并列排名在实际业务中至少有三种不同的处理方式每种方式对应不同的业务含义处理方式并列第一后的下一个排名适用场景标准竞争排名第三名1,1,3大多数竞赛、考试排名密集排名第二名1,1,2等级评定、分层分档平均排名1.51,1,1.5统计分析、学术评估RANK和RANK.EQ默认采用第一种也就是标准竞争排名。两个并列第一下一个就是第三名中间没有第二名。这是最常见的排名口径也是大多数Excel用户默认接受的。但如果业务方要求“并列第一后面应该是第二”那就需要用到密集排名RANK函数本身做不到得配合COUNTIF或者用其他函数组合来实现。2.2 RANK.EQ和RANK.AVG的差异RANK.EQ的语法和RANK完全一样行为也完全一样遇到并列时返回最优排名。比如数据是10、20、20、30降序排名结果是4、2、2、1两个20并列第二下一个10排第四。RANK.AVG则在并列时返回平均排名。同样的数据RANK.AVG的结果是4、2.5、2.5、1两个20并列平均排名是(23)/22.5。RANK.AVG在什么场景下有用我遇到过的典型场景是学术评审或者绩效打分多个评委给同一个对象打分最终排名需要体现“并列者共享排名区间”的概念。但大多数业务场景下RANK.EQ的标准竞争排名更符合直觉。2.3 用COUNTIF实现密集排名密集排名的公式思路是统计比当前值大的数字有几个然后加1。公式如下COUNTIF($A$2:$A$11, A2) 1这个公式的逻辑是比A2大的数字有N个那么A2的排名就是N1。如果有两个并列第一比它们大的数字都是0个所以排名都是1下一个数字比它大的有2个两个并列第一所以排名是3不对这里要的是密集排名并列第一后面应该是第二。密集排名的正确公式需要去重计数SUMPRODUCT(($A$2:$A$11A2)/COUNTIF($A$2:$A$11, $A$2:$A$11)) 1这个公式看起来复杂拆开看就清楚了。$A$2:$A$11A2返回一组TRUE/FALSETRUE表示比当前值大。COUNTIF($A$2:$A$11, $A$2:$A$11)返回每个数字在整个区域中出现的次数。两者相除再求和得到的就是“比当前值大的不重复数字个数”。加1就是密集排名。这个公式在数据量不大的时候完全够用但数据量上万时SUMPRODUCT的性能会明显下降。如果数据量大建议用辅助列或者Power Query来处理。提示如果你的Excel版本支持动态数组可以用MATCH(A2, SORT(UNIQUE($A$2:$A$11), 1, -1), 0)来实现密集排名逻辑更直观性能也更好。SORTUNIQUE先去重再降序排列MATCH返回位置。3. 分组排名按部门、班级、类别分别排3.1 分组排名的核心逻辑分组排名是实际工作中需求最旺盛的排名场景之一。比如一张表里有销售一部、销售二部、销售三部的业绩数据你需要知道每个人在自己部门内的排名而不是全公司的大排名。RANK函数本身不支持分组但配合COUNTIFS或者SUMPRODUCT就可以实现。核心思路是在比较区域中只统计与当前行同组的数字。假设数据在A列部门、B列业绩你要在C列显示部门内排名。公式如下COUNTIFS($A$2:$A$11, A2, $B$2:$B$11, B2) 1这个公式的逻辑是统计部门等于A2、且业绩大于B2的行数加1就是当前行在部门内的降序排名。COUNTIFS天然支持多条件所以分组排名用COUNTIFS比RANK更直接。3.2 分组排名中的并列处理COUNTIFS方案默认也是标准竞争排名并列第一后面直接跳到第三。如果业务方要求密集排名公式需要调整SUMPRODUCT(($A$2:$A$11A2)*($B$2:$B$11B2)/COUNTIFS($A$2:$A$11, $A$2:$A$11, $B$2:$B$11, $B$2:$B$11)) 1这个公式比前面的密集排名公式多了一层部门条件。($A$2:$A$11A2)确保只统计同部门的数据($B$2:$B$11B2)确保只统计业绩更高的数据COUNTIFS(...)计算每个“部门业绩”组合的出现次数用于去重。三者配合得到的就是部门内的密集排名。这个公式我第一次写的时候调试了将近半小时主要卡在COUNTIFS的多条件去重上。后来发现关键点是COUNTIFS的条件区域和条件要一一对应且去重时的条件组合必须和前面的筛选条件完全一致否则去重逻辑会出错。3.3 多级分组排名如果分组不止一层比如先按大区、再按城市、最后按门店排名COUNTIFS可以继续叠加条件COUNTIFS($A$2:$A$11, A2, $B$2:$B$11, B2, $C$2:$C$11, C2) 1这里A列是大区B列是城市C列是业绩。公式统计的是“同大区、同城市、业绩更高”的行数加1就是门店在“大区-城市”这个最小分组内的排名。多级分组排名的注意事项是条件顺序不影响结果但条件的完整性很重要。如果你漏掉了某个分组条件排名就会跨组比较结果就错了。我通常会在写公式前先在纸上画出分组层级确保每个层级都对应一个条件。4. 多条件综合排名当排名依据不止一个数字4.1 综合排名的业务场景有些排名不是靠单一指标决定的。比如学生排名总分相同的情况下看数学成绩数学成绩也相同的情况下看语文成绩。再比如销售排名销售额相同的情况下看回款率回款率也相同的情况下看客户满意度。这种多条件综合排名RANK函数直接做不到需要用SUMPRODUCT或者辅助列来实现。4.2 用SUMPRODUCT实现多条件排名假设A列是总分B列是数学成绩C列是语文成绩你要按“总分数学语文”的优先级降序排名。公式如下SUMPRODUCT(($A$2:$A$11A2)*1) SUMPRODUCT(($A$2:$A$11A2)*($B$2:$B$11B2)*1) SUMPRODUCT(($A$2:$A$11A2)*($B$2:$B$11B2)*($C$2:$C$11C2)*1) 1这个公式分三段第一段统计总分比当前行高的行数。第二段在总分相同的行中统计数学比当前行高的行数。第三段在总分和数学都相同的行中统计语文比当前行高的行数。最后加1得到综合排名。这个公式的逻辑是“逐级比较”先比第一优先级第一优先级相同再比第二优先级以此类推。公式虽然长但结构清晰容易理解和修改。如果优先级有变化只需要调整各段的顺序和条件即可。4.3 用辅助列简化多条件排名SUMPRODUCT方案虽然可行但公式太长维护成本高。更实用的做法是加一个辅助列把多条件转换成一个综合分值然后用RANK排名。比如总分占70%数学占20%语文占10%辅助列公式A2*0.7 B2*0.2 C2*0.1然后对辅助列用RANK排名。这种方式的优点是公式简洁、计算效率高、排名逻辑一目了然。缺点是权重需要事先确定且权重变化时需要重新计算。如果不想用权重也可以用“总分10000 数学100 语文”这种方式构造综合分值前提是各科成绩都是整数且不超过100。这样构造出来的综合分值天然满足“总分优先、数学次之、语文再次”的排序逻辑且不会出现分值重叠。注意辅助列方案的一个潜在问题是如果各科成绩的范围不确定构造综合分值时要留足间隔。比如数学和语文都是0-100那总分乘以10000就够了但如果某科成绩可能超过100间隔就要相应放大。5. 动态排名让排名随筛选和排序自动更新5.1 SUBTOTAL和RANK的配合普通RANK函数有一个“缺陷”它对隐藏行和筛选结果一视同仁。也就是说如果你对数据做了筛选RANK仍然按照全部数据排名而不是按照筛选后的可见数据排名。如果你需要“筛选后重新排名”可以用SUBTOTAL配合辅助列来实现。SUBTOTAL函数有一个特性它会忽略隐藏行取决于第一个参数是1xx还是10x。利用这个特性可以构造一个“可见行计数”辅助列然后基于这个辅助列做排名。具体做法是加一个辅助列D公式为SUBTOTAL(103, $A$2:A2)这个公式会返回从A2到当前行的可见行数。筛选后隐藏行的SUBTOTAL结果不变但可见行的结果会重新计算。然后对D列用RANK排名就能得到筛选后的动态排名。这个方案我第一次用的时候觉得挺巧妙但实际用下来发现一个问题SUBTOTAL的103参数对应COUNTA只统计非空单元格。如果你的数据区域有空行计数会出错。所以用这个方案的前提是数据区域没有空行或者你用SUBTOTAL(102, ...)对应COUNT只统计数字。5.2 用表格结构化引用实现自动扩展如果你的数据经常增减行用超级表CtrlT管理数据是最省心的方案。超级表的引用会自动扩展RANK公式中的比较区域不需要手动调整。比如你把A2:B11转成超级表表名为“销售数据”B列的排名公式写成RANK([业绩], [业绩], 0)当你新增一行数据时超级表自动扩展公式自动填充比较区域自动包含新数据。不需要手动拖拽公式也不需要调整引用区域。超级表的另一个好处是你可以直接用列名引用公式可读性比A2:A11这种地址引用高得多。几个月后回头看一眼就知道公式在算什么。5.3 排名结果不随排序变化有时候你希望排名结果固定下来不随源数据的排序变化而变化。比如你按业绩降序排列后排名列显示1、2、3、4……然后你按姓名排序排名列仍然保持原来的1、2、3、4而不是跟着姓名重新排。这个需求用RANK函数本身做不到因为RANK是实时计算的。解决方案是先用RANK算出排名然后复制排名列选择性粘贴为数值。这样排名就固定下来了后续排序不会影响。但这样做有一个代价源数据变化后排名不会自动更新。所以这个方案适合“排名结果需要固化”的场景比如生成最终报告、发布排名榜单等。如果源数据还会变动建议保留公式用其他方式控制显示顺序。6. 排名函数选型对照与常见问题排查6.1 不同排名需求的函数选型对照排名需求推荐方案公式示例注意事项单列降序排名RANK.EQRANK.EQ(A2,$A$2:$A$11,0)绝对引用比较区域单列升序排名RANK.EQRANK.EQ(A2,$A$2:$A$11,1)order参数显式写出并列取平均排名RANK.AVGRANK.AVG(A2,$A$2:$A$11,0)仅特定场景使用密集排名SUMPRODUCTCOUNTIF见2.3节数据量大时性能下降单条件分组排名COUNTIFSCOUNTIFS($A$2:$A$11,A2,$B$2:$B$11,B2)1条件区域绝对引用多级分组排名COUNTIFS多条件见3.3节确保分组条件完整多条件综合排名SUMPRODUCT逐级比较见4.2节公式长但逻辑清晰多条件综合排名简化辅助列RANK见4.3节权重需事先确定筛选后动态排名SUBTOTALRANK见5.1节数据区域不能有空行自动扩展排名超级表RANKRANK([业绩],[业绩],0)推荐优先使用6.2 排名结果不对的排查清单排名算出来跟预期不一致按以下顺序排查检查比较区域是否绝对引用。这是最高频的错误。选中公式单元格按F2进入编辑模式看看比较区域有没有$符号。如果没有往下拖拽后区域会偏移排名全错。检查order参数是否搞反。降序排名用了1升序排名用了0结果会完全颠倒。确认业务上“第一名”对应的是最大值还是最小值。检查是否有隐藏字符或文本型数字。A列看起来是数字但实际是文本格式左上角有绿色小三角RANK会把文本当0处理排名结果自然不对。用ISNUMBER(A2)检查返回FALSE就是文本型数字需要转换成数值。检查比较区域是否包含了不该包含的行。比如表头行、汇总行、空行。RANK会把汇总行的合计数也纳入比较导致排名偏移。确保比较区域只包含明细数据。检查是否有重复值导致并列排名。如果业务方不接受并列排名需要先处理重复值或者用辅助列加一个极小的随机数来打破并列。6.3 排名函数的性能考量RANK.EQ和RANK.AVG的性能很好几万行数据基本秒出。COUNTIFS的性能中等几千行没问题上万行会开始变慢。SUMPRODUCT的性能最差因为它会对每个单元格进行数组运算数据量上万时可能卡顿。如果数据量很大比如超过5万行建议用以下方案替代用Power Query做排名Power Query的Table.AddRankColumn函数专门用于排名性能远好于工作表函数。用数据透视表的“排名”功能透视表内部做了优化大数据量下表现稳定。用辅助列把多条件排名转换成单条件排名然后用RANK.EQ性能最好。我自己的经验是工作表函数适合几千行以内的数据超过这个量级就应该考虑Power Query或者数据库方案。Excel的工作表计算引擎毕竟不是为大数据设计的硬扛大数据量只会让自己难受。7. 几个我踩过的坑和实际案例7.1 合并单元格导致的排名错乱有一次帮同事排查一个排名问题数据量不大公式看起来也没错但排名结果就是不对。后来发现A列有合并单元格合并单元格的值只存在于左上角单元格其他单元格实际上是空的。RANK在比较时空单元格被当作0处理导致排名偏移。解决方案是取消合并单元格填充空白值然后再排名。如果业务上必须保留合并单元格的视觉效果可以用“跨列居中”替代合并这样每个单元格都有值不影响计算。7.2 排名结果出现小数RANK.AVG在并列时会返回小数比如2.5。如果业务方不接受小数排名要么改用RANK.EQ要么用ROUND函数处理。但ROUND之后可能出现两个不同的排名值四舍五入后相同的情况需要额外处理。我通常的做法是先跟业务方确认排名的口径。如果对方说“并列就并列后面跳号”那就用RANK.EQ如果对方说“并列取平均”那就用RANK.AVG并解释清楚小数排名的含义。7.3 跨表排名有时候排名依据的数据在另一个工作表甚至另一个文件里。RANK函数支持跨表引用比如RANK(A2, 数据表!$A$2:$A$100, 0)。但跨文件引用时如果源文件关闭排名结果会变成#REF!错误。所以跨文件排名时建议先把数据复制到同一个文件或者用Power Query建立连接。跨表排名的一个实用技巧是用定义名称来管理比较区域。比如把“数据表!$A$2:$A$100”定义名称为“业绩数据”公式写成RANK(A2, 业绩数据, 0)。这样公式更简洁区域调整时只需要修改定义名称不需要改每个公式。7.4 排名与条件格式的配合排名算出来之后通常还需要用条件格式做可视化。比如前三名标绿色后三名标红色。条件格式的公式可以直接引用排名列比如$C23标绿色$C2COUNT($C$2:$C$11)-2标红色。这里有一个细节条件格式的公式中引用排名列时要用混合引用锁定列不锁定行确保每一行都根据自己的排名值判断格式。如果用了绝对引用所有行都会按同一个排名值判断格式就全错了。8. 从排名函数延伸出去的几个实用技巧8.1 用LARGE和SMALL提取排名对应的值RANK告诉你某个值排第几LARGE和SMALL则反过来告诉你第几名对应的值是多少。LARGE($A$2:$A$11, 1)返回第一名对应的业绩LARGE($A$2:$A$11, 2)返回第二名对应的业绩以此类推。这个组合在做“TOP N”报表时特别有用。比如你想列出业绩前三名的姓名和业绩可以用LARGE提取业绩值再用INDEXMATCH反查姓名。如果存在并列LARGE会返回重复值需要额外处理。8.2 用RANK配合INDEXMATCH做排名榜单单纯用RANK只能得到排名数字要做成“第一名张三第二名李四”这样的榜单需要INDEXMATCH配合。假设A列是姓名B列是业绩C列是排名你可以用INDEX($A$2:$A$11, MATCH(ROW()-1, $C$2:$C$11, 0))来提取对应名次的姓名。这个方案的前提是排名列没有并列。如果有并列MATCH只会返回第一个匹配项后面的并列者会被跳过。处理并列榜单需要更复杂的公式或者直接用排序辅助列的方式。8.3 排名结果的动态可视化排名数据用条件格式的数据条Data Bars来展示效果很直观。选中排名列条件格式→数据条排名越靠前数据条越短因为排名数字越小视觉上跟业绩数据条正好相反。如果你希望数据条长度跟排名正相关第一名最长可以用公式MAX($C$2:$C$11)-C21构造一个反向排名辅助列然后对辅助列加数据条。这样第一名对应的辅助列值最大数据条最长视觉上更符合直觉。8.4 排名函数在绩效管理中的实际应用绩效管理中经常需要做强制分布比如“优秀20%、良好70%、待改进10%”。这个需求可以用RANK配合PERCENTRANK来实现。PERCENTRANK返回某个值在数据集中的百分比排名比如PERCENTRANK($A$2:$A$11, A2)返回A2的百分比排名0到1之间。然后根据百分比排名划分等级百分比排名≥0.8为优秀0.1到0.8为良好0.1为待改进。这个方案比直接用RANK更灵活因为百分比排名不受数据量变化的影响20%的比例在任何数据量下都成立。提示PERCENTRANK在Excel 2010及以后版本中推荐使用PERCENTRANK.INC或PERCENTRANK.EXC。INC包含0和1EXC不包含。绩效强制分布通常用INC。9. 排名公式的调试方法和维护建议9.1 用公式求值器逐步排查Excel的“公式求值器”公式选项卡→公式求值是排查排名公式的利器。它可以一步步展示公式的计算过程让你看到每一步的中间结果。对于SUMPRODUCT这种复杂公式公式求值器能帮你快速定位是哪一段出了问题。我通常的调试流程是先选中公式单元格打开公式求值器点“求值”逐步执行观察每一步的结果是否符合预期。如果某一步的结果不对就说明那一段的逻辑有问题针对性地修改。9.2 用F9键快速查看公式片段在编辑公式时选中公式中的某一段比如$A$2:$A$11A2按F9键Excel会显示这一段的计算结果。对于数组公式F9会显示一个数组结果帮你确认条件判断是否正确。看完之后按Esc键退出不要按Enter否则公式会被替换成计算结果。这个技巧在调试SUMPRODUCT和COUNTIFS时特别有用能快速验证条件区域和条件值是否匹配。9.3 排名公式的文档化排名公式通常比较复杂几个月后回头看可能自己都看不懂。我的习惯是在公式旁边加一个注释列用文字说明公式的逻辑和注意事项。比如“按部门降序排名并列跳号比较区域锁定A2:A11”。如果公式特别复杂我会在单元格批注中写更详细的说明包括公式的适用场景、参数含义、修改方法等。这样即使换了人维护也能快速理解公式的意图。9.4 排名方案的版本管理如果你经常需要调整排名方案比如业务方今天要标准排名明天要密集排名建议把不同方案的公式分别放在不同的列用列标题区分。比如C列是“标准排名”D列是“密集排名”E列是“部门内排名”。这样切换方案时只需要看对应的列不需要反复改公式。这个做法还有一个好处可以对比不同方案的排名结果验证公式的正确性。比如标准排名和密集排名在无并列的情况下结果应该完全一致如果出现差异说明公式有问题。10. 排名函数和其他Excel功能的组合玩法10.1 排名数据验证做动态下拉用数据验证做下拉列表时列表内容可以基于排名动态生成。比如你想做一个“选择TOP N”的下拉选项是1到10然后根据选择的N值用LARGE提取前N名的数据。具体做法是A1单元格用数据验证做下拉1-10B列用LARGE($C$2:$C$100, ROW()-1)提取前N名的值然后用条件格式或IF函数控制只显示前N行。这个方案在做交互式报表时很实用。10.2 排名条件格式做热力图排名数据用色阶Color Scale做热力图可以直观展示排名的分布。选中排名列条件格式→色阶选择红-黄-绿或者蓝-白色阶。排名越靠前数字越小颜色越绿排名越靠后颜色越红。如果希望色阶方向跟排名正相关第一名最绿可以先用MAX($C$2:$C$11)-C21构造反向排名辅助列然后对辅助列加色阶。这样第一名对应的辅助列值最大颜色最绿。10.3 排名透视表做动态排名报表数据透视表本身支持“排名”功能右键点击值字段→值字段设置→值显示方式→排名。透视表的排名会随着透视表的筛选和分组自动更新不需要写公式。透视表排名的优势是性能好、自动更新、支持分组排名。劣势是灵活性不如公式比如不能自定义并列处理方式不能做多条件综合排名。所以透视表排名适合标准场景复杂场景还是得用公式。10.4 排名Power Query做自动化排名Power Query的Table.AddRankColumn函数可以给表添加排名列支持升序、降序、并列处理等选项。Power Query排名的优势是处理大数据量性能好、排名逻辑可视化配置、刷新时自动更新。如果你每天都需要对新增数据做排名用Power Query建立自动化流程是最省心的方案。把数据源连接到Power Query配置好排名步骤以后只需要点“刷新”排名结果自动更新不需要手动拖拽公式。11. 关于排名我最后想分享的几点经验排名这件事技术难度不高但业务口径的确认比公式本身重要得多。我见过太多人闷头写公式写完才发现业务方要的排名口径跟自己理解的不一样返工重来。所以我的建议是动手写公式之前先跟需求方确认三件事——并列怎么处理、分组怎么分、排序方向是什么。这三件事确认清楚了公式选择就明确了。另外排名公式的可维护性比炫技更重要。我早期喜欢用复杂的数组公式觉得一行公式解决所有问题很酷。后来发现复杂公式的调试成本和维护成本太高换个人接手根本看不懂。现在我更倾向于用辅助列把复杂逻辑拆开每一步都清晰可见虽然多占几列但维护起来省心得多。还有一点排名结果一定要做验证。我的习惯是算完排名后用排序功能手动排一下对比排名列的结果是否一致。如果数据量太大不方便手动排至少抽查前几名和后几名确认排名逻辑正确。这个验证步骤花不了几分钟但能避免很多低级错误。最后如果你的排名需求已经复杂到公式很难维护的程度不妨考虑用Python或者数据库来处理。pandas的rank函数支持各种排名口径SQL的窗口函数ROW_NUMBER、RANK、DENSE_RANK也是为排名场景设计的。Excel适合快速分析和中小数据量但数据量大了、逻辑复杂了换个工具可能更高效。工具是为人服务的没必要死磕一个。