=RANK.EQ(B2,$B$2:$B$7) 返回 B2 在 B2:B7 各值中的名次,最大的值排第 1。要让最小的值排第一,把 1 作为第三个参数:=RANK.EQ(B2,$B$2:$B$7,1)。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Name | Sales | Rank (high = 1) | Rank (low = 1) |
| 2 | Ana | 4200 | 3 | 4 |
| 3 | Ben | 3100 | 5 | 2 |
| 4 | Cleo | 5600 | 1 | 6 |
| 5 | Dan | 2800 | 6 | 1 |
| 6 | Eve | 4900 | 2 | 5 |
| 7 | Finn | 3700 | 4 | 3 |
Cleo 的销售额最高,在 C 列排第 1,在 D 列排第 6。把 Dan 的销售额改成 6000,所有名次都会更新。
RANK.EQ 语法
=RANK.EQ(number, ref, [order])
number:要排名的值,通常是同一行的单元格。ref:在其中排名的列表。设为绝对引用($B$2:$B$7),这样向下填充公式时每一行的列表都相同。order:省略或用0表示降序(最大的排 1),用1表示升序(最小的排 1)。
ref 中的文本和空单元格会被忽略。如果 number 根本不在 ref 中,RANK.EQ 返回 #N/A。
RANK.EQ 和 RANK.AVG 是 Excel 2010 引入的。旧的 RANK 函数仍然可用,结果与 RANK.EQ 相同;Google Sheets 三个都有。
并列:RANK.EQ 与 RANK.AVG
值并列时,RANK.EQ 给它们相同的名次,并跳过被占用的名次,就像体育比赛的成绩那样:两个人并列第二,下一个就是第四。RANK.AVG 给每个并列值它们所占位置的平均值。
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Name | Score | RANK.EQ | RANK.AVG | Unique rank |
| 2 | Ana | 95 | 1 | 1 | 1 |
| 3 | Ben | 88 | 2 | 3 | 2 |
| 4 | Cleo | 88 | 2 | 3 | 3 |
| 5 | Dan | 76 | 5 | 5 | 5 |
| 6 | Eve | 88 | 2 | 3 | 4 |
| 7 | Finn | 64 | 6 | 6 | 6 |
Ben、Cleo 和 Eve 并列 88 分。RANK.EQ 给三人都排 2,Dan 排 5。RANK.AVG 给他们排 3,即第 2、3、4 位的平均值。
E 列按在列表中的先后顺序打破并列:COUNTIF($B$2:B2,B2) 统计这个分数从顶部到当前行已出现了几次(填充时只有区域的末端会移动)。第一个 88 加 0,第二个加 1,第三个加 2,所以 1 到 6 每个名次都恰好出现一次。当名次要用于“谁是第 3 名”这样的查找时,就该用这种写法,因为查找需要每个名次都唯一。
组内排名
Excel 没有 RANKIF。要让每位销售人员只和同一区域的人比较,就统计该区域中有多少人卖得更多,再加 1:
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Name | Region | Sales | Rank in region |
| 2 | Ana | North | 4200 | 3 |
| 3 | Ben | South | 3100 | 3 |
| 4 | Cleo | North | 5600 | 1 |
| 5 | Dan | South | 2800 | 4 |
| 6 | Eve | North | 4900 | 2 |
| 7 | Finn | South | 3700 | 1 |
| 8 | Gia | North | 3900 | 4 |
| 9 | Hal | South | 3300 | 2 |
Cleo 在 North 领先,Finn 在 South 领先。把 Ana 的区域改成 South:North 的名次随之补位,South 则多了第五个人。组内升序排名改用 "<"&C2。并列的处理方式与 RANK.EQ 相同:并列的值名次相同。多条件计数的更多内容见 COUNTIFS 一文。
按名次显示前三名
名次列回答的是“这个人排第几”;要回答“谁是第一名”,就按名次查找。C 列是不重复的名次时,=XLOOKUP(1,C2:C7,A2:A7) 返回排名第 1 的名字(在 Excel 2019 及更早版本中用 =INDEX(A2:A7,MATCH(1,C2:C7,0)))。没有名次列时,=LARGE(B2:B7,2) 直接返回第二大的值,=SORTBY(A2:B7,B2:B7,-1) 则把整张表从高到低列出(需要 Excel 2021 或 Microsoft 365;见 SORT 与 SORTBY)。
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Name | Sales | Rank | Place | Name | |
| 2 | Ana | 4200 | 3 | 1 | Cleo | |
| 3 | Ben | 3100 | 5 | 2 | Eve | |
| 4 | Cleo | 5600 | 1 | 3 | Ana | |
| 5 | Dan | 2800 | 6 | |||
| 6 | Eve | 4900 | 2 | |||
| 7 | Finn | 3700 | 4 |
C 列是并列一节中的不重复名次,所以并列永远不会让某个名次空缺。F2 到 F4 列出 Cleo、Eve 和 Ana。把 Ana 的销售额改成 6000,她就会升到第一。
动手试试:最快的跑者排第一
| A | B | C | |
|---|---|---|---|
| 1 | Runner | Time | Rank |
| 2 | Ana | 58.4 | |
| 3 | Ben | 55.1 | |
| 4 | Cleo | 61.9 | |
| 5 | Dan | 53.7 | |
| 6 | Eve | 57.3 | |
| 7 | Finn | 60.2 |
轮到你了: 在 C2 中给 B2 中 Ana 的用时在 B2:B7 所有用时中排名,用时最快(最小)的排第 1。公式会向下填充到 C7,所以列表要用绝对引用。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Student | Class | Score | Rank in class |
| 2 | Ana | Red | 81 | |
| 3 | Ben | Red | 92 | |
| 4 | Cleo | Blue | 77 | |
| 5 | Dan | Red | 69 | |
| 6 | Eve | Blue | 95 | |
| 7 | Finn | Red | 85 | |
| 8 | Gia | Blue | 88 |
轮到你了: 在 D2 中只在 Ana 所在班级(B 列)的学生中给她的分数排名,分数最高的排第 1。公式会向下填充到 D8。
常见错误:区域用了相对引用
没有 $ 符号时,每向下填充一次,区域就下移一行,于是每一行都在一个从本行开始、越来越短的列表中排名。名次看起来合理,实际上是错的:
| A | B | C | |
|---|---|---|---|
| 1 | Name | Sales | Rank |
| 2 | Ana | 4200 | 3 |
| 3 | Ben | 3100 | 4 |
| 4 | Cleo | 5600 | 1 |
| 5 | Dan | 2800 | 3 |
| 6 | Eve | 4900 | 1 |
| 7 | Finn | 3700 | 1 |
点击 C4:它的区域是 B4:B9,所以 Cleo 只和她这一行及以下的人比较。尽管 Cleo 卖得更多,Eve 却显示第 1;Finn 也显示第 1,因为他只和自己比较。把 C2 改成 =RANK.EQ(B2,$B$2:$B$7),整列就会自动纠正。光标在区域中时按 F4 即可添加 $ 符号(Mac 上按 Cmd+T 或 Fn+F4);原因见绝对引用。
常见问题
Excel 中如何给数字排名?
用 =RANK.EQ(B2,$B$2:$B$7) 并向下填充。最大的值排第 1。区域要保留 $ 符号,这样填充时它不会移动。
Excel 中如何从小到大排名?
把 1 作为第三个参数:=RANK.EQ(B2,$B$2:$B$7,1)。适用于比赛用时、价格等最小值应该排第一的情况。
RANK.EQ 和 RANK.AVG 有什么区别?
两者只在并列时不同。如果两个值并列第二,RANK.EQ 给两者都排 2,下一个值排 4。RANK.AVG 给两者都排 2.5,即第 2 和第 3 位的平均值。
Excel 中如何做不重复的排名?
加上该值的累计出现次数:=RANK.EQ(B2,$B$2:$B$7)+COUNTIF($B$2:B2,B2)-1。两个并列值中的第一个保留原名次,第二个得到下一个名次。
Excel 中如何在组内排名?
统计同组中比它大的值的个数,再加 1:=COUNTIFS($A$2:$A$9,A2,$C$2:$C$9,">"&C2)+1。Excel 没有 RANKIF 函数。