【rownumber和rank区别】在SQL查询中,`ROW_NUMBER()` 和 `RANK()` 是两个常用的窗口函数,用于对结果集进行排序和编号。虽然它们都能对数据进行排序并分配序号,但两者在处理重复值时的行为有所不同。下面将从定义、使用场景、行为差异等方面进行总结,并通过表格形式对比两者的区别。
一、基本概念
- ROW_NUMBER()
`ROW_NUMBER()` 是一个窗口函数,它为每一行分配一个唯一的数字,按照指定的排序方式递增。即使有相同的排序值,也会分配不同的序号。
- RANK()
`RANK()` 同样是一个窗口函数,它会根据排序值对行进行排名。如果有相同的排序值,它们会获得相同的排名,但下一个排名会跳过重复的数目。
二、使用场景
函数 | 使用场景 |
ROW_NUMBER | 需要唯一标识每一行,例如分页、去重、唯一排序等。 |
RANK | 需要根据某种条件进行排名,如成绩排名、销售排名等,允许并列名次。 |
三、行为差异对比(以相同排序值为例)
假设有一个表 `scores`,其中包含字段 `name` 和 `score`,数据如下:
name | score |
Alice | 90 |
Bob | 85 |
Charlie | 90 |
David | 80 |
使用 `ROW_NUMBER()` 的结果:
name | score | row_number |
Alice | 90 | 1 |
Charlie | 90 | 2 |
Bob | 85 | 3 |
David | 80 | 4 |
使用 `RANK()` 的结果:
name | score | rank |
Alice | 90 | 1 |
Charlie | 90 | 1 |
Bob | 85 | 3 |
David | 80 | 4 |
四、总结对比表
对比项 | ROW_NUMBER() | RANK() |
是否允许重复值 | 不允许,每行唯一 | 允许,相同值获得相同排名 |
排名是否连续 | 是,始终连续 | 否,可能不连续 |
适用场景 | 唯一排序、分页、去重 | 排名统计、成绩排名、绩效评估 |
处理相同值 | 分配不同序号 | 分配相同排名,后续排名跳过 |
性能 | 通常略高(因无需比较) | 可能稍低(需比较相同值) |
五、结论
`ROW_NUMBER()` 更适合需要唯一标识每一行的场景,而 `RANK()` 则更适合需要体现“并列”排名的情况。选择哪个函数取决于具体业务需求。理解这两个函数的区别有助于更高效地进行数据分析与报表生成。