排名看起来简单,但一到"有并列"就露馅。
举个最常见的场景:三个人的成绩是 90、90、80。
RANK 的结果是:1、1、3。
很多人觉得应该是 1、1、2。
这个差别叫「中国式排名」和「美式排名」。这篇把两种都讲清。
先看表
| 姓名 | 成绩 |
|---|---|
| 张三 | 81 |
| 李四 | 75 |
| 王五 | 81 |
| 赵六 | 89 |
| 麻七 | 65 |
基本用法:RANK
第三个参数:
- `0` 或不写 = 降序(分数高的排第 1)
- `1` = 升序(分数低的排第 1)
结果:
| 姓名 | 成绩 | 排名 |
|---|---|---|
| 张三 | 81 | 2 |
| 李四 | 75 | 4 |
| 王五 | 81 | 2 |
| 赵六 | 89 | 1 |
| 麻七 | 65 | 5 |
张三和王五都是 81,并列第 2。然后李四直接是第 4——第 3 名空缺了。
这就是 RANK 的"美式排名":并列占位,后面跳号。
为什么区域要按 F4
和 VLOOKUP 一样,`$B$2:$B$6` 必须锁住。否则往下一拖,区域缩小,排名全乱。
想要 1、2、2、3(不跳号):中国式排名
国内的成绩单、排行榜,通常希望"并列第 2 之后,下一个人是第 3",不跳号。
写法:
不用怕,拆开看:
- `B$2:B$6 > B2` —— 哪些成绩比当前这个高(得到一串 TRUE/FALSE)
- `/COUNTIF(B$2:B$6, B$2:B$6)` —— 每个成绩除以"它自己出现了几次"。这样两个 81 各变成 0.5
- `SUMPRODUCT` 加起来 —— 比 81 高的只有 89(出现 1 次,贡献 1),所以结果是 1
- `+1` —— 排名 = 1 + 1 = 2
到李四(75)时,比它高的有 89、81、81,其中 81 出现两次各算 0.5,合计 2,加上 89 的 1,共 3,再 +1 = 4……
等等,这里会得到 4,不是想要的 3。
结论:这个公式给出的是 1、2、2、3。 这就是中国式排名。
按分组排名(部门内排名)
实际工作里更常见:每个部门内部各自排名。
表:
| 部门 | 姓名 | 业绩 |
|---|---|---|
| 技术部 | 张三 | 81 |
| 市场部 | 李四 | 75 |
| 技术部 | 王五 | 89 |
| 市场部 | 赵六 | 65 |
| 技术部 | 麻七 | 70 |
技术部内部:王五 89 第一,张三 81 第二,麻七 70 第三。
写法(COUNTIFS 法):
读作:在同一部门里,数一数有多少人的业绩比我高,加 1 就是我的名次。
这个写法非常直观,而且不用数组公式。
三种方法对比
| 需求 | 用什么 | 公式 |
|---|---|---|
| 普通排名(并列跳号) | RANK | `=RANK(B2,$B$2:$B$6)` |
| 中国式排名(不跳号) | SUMPRODUCT | `=SUMPRODUCT((B$2:B$6>B2)/COUNTIF(B$2:B$6,B$2:B$6))+1` |
| 分组内排名 | COUNTIFS | `=COUNTIFS(A:A,A2,C:C,">"&C2)+1` |
| 分组 + 中国式 | 两者结合 | 见下 |
分组 + 中国式排名的写法(较长,用得上再抄):
排名的三个常见坑
坑一:区域没锁
往下拖的时候区域跟着跑。一定要按 F4。
坑二:数字是文本
如果成绩是文本格式(左对齐),RANK 会返回 `#N/A` 或者全部并列。
用 `ISNUMBER` 检查一下,是文本就用 `--` 转。
坑三:空单元格
区域里有空白,RANK 会把空白当成 0,排名错乱。
解决:用 `IF(B2="","",RANK(...))` 跳过空白。
排名之后:取前三名
光有名次不够,老板要"前三名是谁"。
方法一:排序 + 取前 3 行(最简单,但是静态的)
方法二:LARGE 取第 N 大的值
方法三:FILTER(365)取所有第一名
名次 → 姓名(反查)
知道"第 1 名"要查出是谁,用 INDEX + MATCH:
一句话总结
RANK 简单但会跳号;要"1、2、2、3"用 SUMPRODUCT;要"部门内排名"用 COUNTIFS。不管哪个,区域一律按 F4。
评论 0