跳到主要内容

rank

一、排名函数基本介绍​

1. 函数发展历史​

  • RANK():Excel 2007及以前版本的函数,为保持兼容性保留
  • RANK.EQ():Excel 2010引入,功能与RANK()相同,是新标准
  • RANK.AVG():Excel 2010引入,相同数值时返回平均排名

2. 函数语法对比​

函数语法说明
RANK()=RANK(number, ref, [order])传统排名函数
RANK.EQ()=RANK.EQ(number, ref, [order])等价于RANK(),推荐使用
RANK.AVG()=RANK.AVG(number, ref, [order])相同数值返回平均排名

3. 参数详解​

参数说明必需
number要排名的数值是
ref包含所有要排名的数值的区域是
order排序方式:0或省略=降序,非0=升序否

注意:

  • 降序排名:数值越大排名越靠前(第1名是最大值)
  • 升序排名:数值越小排名越靠前(第1名是最小值)

二、详细示例数据表​

表1:学生考试成绩表(20条记录)​

学号姓名语文数学英语总分平均分
S001张三85927825585.0
S002李四78958826187.0
S003王五92887625685.3
S004赵六65726820568.3
S005孙七88969227692.0
S006周八76857924080.0
S007吴九95899427892.7
S008郑十82788524581.7
S009钱一89928726889.3
S010王一73687221371.0
S011刘二91948927491.3
S012陈三68757021371.0
S013杨四87908626387.7
S014黄五79828024180.3
S015赵七94979528695.3
S016周九72797422575.0
S017吴十86888425886.0
S018郑一90939127491.3
S019王二81848224782.3
S020孙三70767321973.0

表2:销售业绩表(15条记录)​

销售员ID姓名1月2月3月季度总额平均月销
SA01张明158000142000165000465000155000
SA02李华145000138000152000435000145000
SA03王芳128000135000142000405000135000
SA04赵强165000158000172000495000165000
SA05孙丽142000148000155000445000148333
SA06周伟135000128000140000403000134333
SA07吴刚152000162000158000472000157333
SA08郑洁138000145000148000431000143667
SA09钱勇148000152000146000446000148667
SA10王静125000132000128000385000128333
SA11刘洋162000155000168000485000161667
SA12陈晨155000148000162000465000155000
SA13杨光132000138000135000405000135000
SA14黄蓉142000135000148000425000141667
SA15赵云158000152000165000475000158333

表3:产品销量表(相同数值测试)​

产品ID产品名称销量销售额(元)
P001iPhone 151501,125,000
P002华为P60120960,000
P003小米131801,080,000
P004MacBook Pro851,275,000
P005华为平板120720,000
P006三星电视95855,000
P007索尼耳机150450,000
P008戴尔笔记本110990,000
P009联想电脑105735,000
P010苹果手表1801,080,000

三、基础用法示例​

示例1:基本降序排名(成绩排名)​

在表1的H列(总分排名)输入公式:
=RANK.EQ(F2, $F$2:$F$21, 0)

或者使用RANK():
=RANK(F2, $F$2:$F$21, 0)

解释:
- F2:要排名的总分
- $F$2:$F$21:总分区域(绝对引用)
- 0:降序排名(分数越高排名越靠前)

结果示例:

姓名总分排名
赵七2861
吴九2782
孙七2763
刘二2744
郑一2744
钱一2686

示例2:升序排名(用时最少排名)​

假设有比赛用时数据,时间越少成绩越好:

在I列(用时排名)输入公式:
=RANK.EQ(G2, $G$2:$G$21, 1)

解释:
- G2:比赛用时
- 1:升序排名(用时越少排名越靠前)

示例3:多科目分别排名​

语文排名:=RANK.EQ(C2, $C$2:$C$21, 0)
数学排名:=RANK.EQ(D2, $D$2:$D$21, 0)
英语排名:=RANK.EQ(E2, $E$2:$E$21, 0)

四、RANK() vs RANK.EQ() vs RANK.AVG() 对比​

示例4:相同数值的排名对比​

使用表3的销量数据进行测试:

1. 使用RANK.EQ()或RANK():
=RANK.EQ(B2, $B$2:$B$11, 0)
结果:相同销量得到相同排名,后续排名跳过

2. 使用RANK.AVG():
=RANK.AVG(B2, $B$2:$B$11, 0)
结果:相同销量得到平均排名

对比结果表:

产品名称销量RANK.EQ排名RANK.AVG排名说明
小米1318011.5与苹果手表并列,平均排名(1+2)/2=1.5
苹果手表18011.5同上
iPhone 1515033.5与索尼耳机并列,(3+4)/2=3.5
索尼耳机15033.5同上
华为P6012055.5与华为平板并列,(5+6)/2=5.5
华为平板12055.5同上
戴尔笔记本11077唯一值
联想电脑10588唯一值
三星电视9599唯一值
MacBook Pro851010唯一值

示例5:并列排名的差异​

情况:4个人得分相同,都是90分
最高分100分有1人,95分有2人

RANK.EQ结果:
100分:第1名
95分:第2名(2人并列)
90分:第4名(4人并列)← 注意:跳过了第3名

RANK.AVG结果:
100分:第1名
95分:第2.5名((2+3)/2=2.5)
90分:第5名((4+5+6+7)/4=5.5)

五、实际应用场景​

场景1:学生成绩排名系统​

在表1中添加排名列:

H列(总分排名):=RANK.EQ(F2, $F$2:$F$21, 0)
I列(班级排名百分比):=H2/COUNT($F$2:$F$21)
J列(前10%标记):=IF(I2<=0.1, "优秀", "")
K列(排名变化):与前次考试排名比较

场景2:销售业绩排行榜​

在表2中添加排名列:

H列(季度排名):=RANK.EQ(F2, $F$2:$F$16, 0)
I列(月度平均排名):=RANK.EQ(G2, $G$2:$G$16, 0)
J列(奖金等级):
=LOOKUP(H2, {1,4,8,12}, {"特等","一等","二等","三等"})

场景3:体育比赛排名系统​

数据:运动员 | 100米成绩 | 跳远成绩 | 总分

1. 单项排名(时间越少越好):
百米排名:=RANK.EQ(B2, $B$2:$B$20, 1)

2. 综合排名(分数越高越好):
总分排名:=RANK.EQ(D2, $D$2:$D$20, 0)

3. 双排名差异:
=ABS(百米排名-总分排名) // 发现偏科选手

场景4:产品质量评分排名​

数据:产品ID | 外观分 | 性能分 | 耐用分 | 总分

加权总分:=B2*0.3+C2*0.5+D2*0.2
综合排名:=RANK.AVG(E2, $E$2:$E$50, 0)
等级划分:
=IF(F2<=10, "A级",
IF(F2<=30, "B级",
IF(F2<=50, "C级", "D级")))

六、常见问题与解决方案​

问题1:为什么我的排名结果不对?​

可能原因及解决:

1. 区域引用错误:
错误:=RANK.EQ(A2, A2:A100, 0) // 相对引用
正确:=RANK.EQ(A2, $A$2:$A$100, 0) // 绝对引用

2. 数据包含非数值:
解决:=RANK.EQ(VALUE(A2), $A$2:$A$100, 0)

3. 排序方式理解错误:
order=0:降序(最大值排第1)
order=1:升序(最小值排第1)

问题2:如何处理并列排名?​

需求:中国式排名(不跳过名次)

方法1:使用COUNTIFS
=SUMPRODUCT(($F$2:$F$21>F2)/COUNTIF($F$2:$F$21,$F$2:$F$21))+1

方法2:使用FREQUENCY
=SUM(--(FREQUENCY($F$2:$F$21, $F$2:$F$21)>0))-SUM(--(FREQUENCY($F$2:$F$21, IF($F$2:$F$21>F2, $F$2:$F$21))>0))

方法3:简单但有限制
=RANK.EQ(F2, $F$2:$F$21, 0)+COUNTIF($F$2:F2, F2)-1

问题3:如何排除某些值不参与排名?​

假设成绩为0表示缺考,不参与排名:

=IF(F2=0, "缺考",
RANK.EQ(F2,
FILTER($F$2:$F$21, $F$2:$F$21>0),
0))

问题4:如何实现分组排名?​

数据:班级 | 姓名 | 成绩
需求:每个班级内部排名

数组公式:
=SUMPRODUCT(($A$2:$A$100=A2)*($C$2:$C$100>C2))+1

七、高级技巧与应用​

技巧1:动态排名区域​

使用OFFSET定义动态区域:
=RANK.EQ(F2, OFFSET($F$2,0,0,COUNTA($F:$F)-1,1), 0)

或者使用表格:
=RANK.EQ([@总分], [总分], 0)

技巧2:条件排名​

需求:只排名男生的成绩

数组公式(Ctrl+Shift+Enter):
=SUM((B$2:B$100="男")*(C$2:C$100>C2))+1

技巧3:百分比排名​

计算成绩在前百分之多少:

方法1:使用PERCENTRANK
=PERCENTRANK.INC($F$2:$F$21, F2)

方法2:手动计算
=RANK.EQ(F2, $F$2:$F$21, 0)/COUNT($F$2:$F$21)

技巧4:多条件加权排名​

综合成绩 = 平时成绩×30% + 期中×30% + 期末×40%
综合排名 = RANK.EQ(综合成绩, 综合成绩区域, 0)

分项排名:
平时排名:RANK.EQ(平时成绩, 平时成绩区域, 0)
稳定性评分:=AVERAGE(各次排名标准差) // 越小越稳定

技巧5:排名变化追踪​

本月排名:=RANK.EQ(F2, $F$2:$F$21, 0)
上月排名:从历史表获取
排名变化:=本月排名-上月排名
进步标记:=IF(排名变化<0, "↑进步", IF(排名变化>0, "↓退步", "-持平"))

八、RANK函数与其他函数组合​

组合1:RANK + IF(条件显示)​

=IF(F2>=60, RANK.EQ(F2, $F$2:$F$21, 0), "不及格")
=IF(RANK.EQ(F2, $F$2:$F$21, 0)<=10, "前十名", "")

组合2:RANK + VLOOKUP(查找对应信息)​

先排名,再根据排名查找学生信息:
排名列:=RANK.EQ(F2, $F$2:$F$21, 0)

查找第1名姓名:
=VLOOKUP(1, CHOOSE({1,2}, H$2:H$21, B$2:B$21), 2, FALSE)

组合3:RANK + LARGE/SMALL(获取前N名)​

获取前3名成绩:
第1名:=LARGE($F$2:$F$21, 1)
第2名:=LARGE($F$2:$F$21, 2)
第3名:=LARGE($F$2:$F$21, 3)

获取第1名姓名:
=INDEX($B$2:$B$21, MATCH(LARGE($F$2:$F$21, 1), $F$2:$F$21, 0))

组合4:RANK + COUNTIF(处理重复值)​

在有重复值时添加辅助排名:
=RANK.EQ(F2, $F$2:$F$21, 0) + COUNTIF($F$2:F2, F2) - 1

九、性能优化建议​

1. 避免整列引用​

不好:=RANK.EQ(A2, A:A, 0) // 全列计算
好:=RANK.EQ(A2, $A$2:$A$1000, 0) // 限定范围

2. 使用排序减少计算​

如果数据已排序,可以使用更简单的公式:
降序排序后:=MATCH(F2, $F$2:$F$21, -1)
升序排序后:=MATCH(F2, $F$2:$F$21, 1)

3. 批量计算​

将排名公式放在一个单元格,然后向下填充
避免在条件格式中直接使用RANK函数

4. 考虑使用数据透视表​

对于大数据量的排名,数据透视表的排序功能更高效。


十、综合实战案例​

案例1:学生成绩综合排名系统​

目标:创建包含以下功能的系统
1. 各科排名
2. 总分排名
3. 班级排名百分比
4. 进步退步分析
5. 奖励名单自动生成

实现步骤:
1. 计算各科排名:=RANK.EQ(C2, $C$2:$C$21, 0)
2. 计算总分排名:=RANK.EQ(F2, $F$2:$F$21, 0)
3. 百分比排名:=H2/COUNT($F$2:$F$21)
4. 进步分析:与前次排名比较
5. 奖励名单:=IF(H2<=10, "获奖", "")

案例2:销售团队绩效看板​

目标:月度销售排名看板
功能:
1. 月度排名
2. 季度累计排名
3. 排名趋势(上升/下降)
4. 奖金自动计算
5. 可视化仪表板

公式示例:
月度排名:=RANK.EQ(C2, $C$2:$C$16, 0)
季度排名:=RANK.EQ(F2, $F$2:$F$16, 0)
排名变化:=本月排名-上月排名
奖金基数:=LOOKUP(月度排名, {1,2,3,4,5}, {10000,8000,6000,4000,2000})

案例3:产品质量评分排名系统​

数据:产品ID | 批次 | 外观分 | 性能分 | 安全分 | 总分

需求:
1. 按批次内排名
2. 历史排名趋势
3. 等级划分(A/B/C/D)
4. 预警机制(连续下降)

实现:
批次内排名:=SUMPRODUCT(($B$2:$B$100=B2)*($F$2:$F$100>F2))+1
等级划分:=LOOKUP(排名, {1,5,10,15}, {"A","B","C","D"})
连续下降预警:=IF(AND(本次排名>上次排名, 上上次排名>上次排名), "预警", "")

十一、版本兼容性说明​

Excel版本RANK()RANK.EQ()RANK.AVG()建议
2003及以前✓✗✗使用RANK()
2007✓✗✗使用RANK()
2010-2013✓✓✓推荐RANK.EQ()
2016-2019✓✓✓推荐RANK.EQ()
365✓✓✓推荐RANK.EQ()

跨版本建议:

=IFERROR(RANK.EQ(A2, $A$2:$A$100, 0),
IFERROR(RANK(A2, $A$2:$A$100, 0),
"函数不可用"))

十二、总结对比表​

特性RANK()RANK.EQ()RANK.AVG()适用场景
相同值处理并列相同排名,跳过后续名次同RANK()返回平均排名需要精确排名时使用EQ,需要平滑排名时使用AVG
版本兼容所有版本2010+2010+旧文件用RANK,新文件用EQ
语法=RANK(num,ref,order)=RANK.EQ(num,ref,order)=RANK.AVG(num,ref,order)参数相同
性能相同相同稍慢(需计算平均)大数据量慎用AVG
推荐度★★★☆☆★★★★★★★★★☆新项目一律用EQ

十三、最佳实践建议​

  1. 新项目一律使用RANK.EQ(),这是未来的标准
  2. 处理并列排名时,明确业务需求:
    • 跳名次排名:RANK.EQ()
    • 平均排名:RANK.AVG()
    • 不跳名次(中国式排名):使用COUNTIFS自定义公式
  3. 使用绝对引用:$F$2:$F$100
  4. 明确排序方向:0=降序,1=升序
  5. 处理错误值:=IFERROR(RANK.EQ(...), "数据异常")
  6. 考虑性能:避免在大型数据集频繁使用RANK函数
  7. 文档记录:在复杂排名逻辑旁添加注释说明

十四、练习题目​

基础练习​

  1. 使用RANK.EQ()计算学生总分排名
  2. 使用RANK.AVG()计算产品销量排名,观察并列差异
  3. 分别使用降序和升序对销售业绩排名

中级练习​

  1. 实现中国式排名(不跳名次)
  2. 创建分组排名系统(按班级、部门等分组)
  3. 设计排名变化趋势分析

高级练习​

  1. 构建多维度加权排名系统
  2. 实现动态排名仪表板
  3. 设计排名预警系统(连续下降预警)

实战挑战​

  1. 模拟奥运会奖牌榜排名规则
  2. 实现电商商品多维度综合排名
  3. 设计员工绩效考核排名系统

最后建议:实际工作中,排名需求往往比想象的复杂。在开始前,一定要与业务方确认清楚排名规则,特别是如何处理并列情况。这是避免返工的关键!