rank() over, dense_rank(), row_number()
时间: 2023-11-07 18:02:12 浏览: 194
rank() over、dense_rank()和row_number()都是窗口函数,用于在查询结果中添加排名信息。
rank() over函数用于计算结果集中每一行的排名,相同数值的行将被赋予相同的排名,并且紧随其后的排名将被跳过。例如,在班级成绩查询中,如果有两个学生得分相同并列第一名,则下一个学生将自动跳过并列为第三名。
dense_rank()函数也用于计算排名,但它不会跳过相同排名的行。即使有多个行具有相同的数值,它们也将被赋予不同的排名。在班级成绩查询中,如果有两个学生得分相同并列第一名,则下一个学生将被赋予第二名。
row_number()函数用于为结果集中的每一行分配一个唯一的行号。无论结果集中是否有相同的值,每一行都将有一个唯一的行号。在班级成绩查询中,无论得分如何,每个学生都将有一个独立的行号。
相关问题
sql中,rank、dense_rank、row_number的区别是什么
在SQL中,`RANK()`, `DENSE_RANK()`, 和 `ROW_NUMBER()` 是用于在查询结果中为行分配排名的窗口函数。它们之间的区别如下:
1. `RANK()` 函数:
- 对于相同的值,它们会分配相同的排名,并跳过下一个排名。
- 如果有两个行具有相同的排名,则下一个排名将被跳过,导致排名不连续。
- 例如,如果有两个行具有排名1,则下一个排名将是3,而不是2。
2. `DENSE_RANK()` 函数:
- 对于相同的值,它们会分配相同的排名,但不会跳过下一个排名。
- 如果有两个行具有相同的排名,则下一个排名将是连续的。
- 例如,如果有两个行具有排名1,则下一个排名将是2,而不是3。
3. `ROW_NUMBER()` 函数:
- 不考虑相同的值,它们为每一行分配唯一的排名。
- 每一行都有一个唯一的、连续的排名。
- 例如,如果有两个行具有排名1,则下一个排名将是2。
这些函数通常与`OVER`子句结合使用,以定义分析窗口,指定排序顺序,并在结果集中为行分配排名。使用这些函数可以根据特定的业务需求来计算、排列和筛选数据。
row_number和rank和dense_rank
row_number、rank和dense_rank都是用于窗口函数中的排序函数。
- row_number:为每一行分配一个唯一的数字,按照指定的排序顺序(默认是升序)进行排序。
- rank:为相同的值分配相同的排名,不连续。例如,如果有两个值的排名为1,则下一个值的排名将为3(跳过2)。
- dense_rank:为相同的值分配相同的排名,连续。例如,如果有两个值的排名为1,则下一个值的排名将为2。
举个例子:
```
SELECT name, score, ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num,
RANK() OVER (ORDER BY score DESC) AS rank_num,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank_num
FROM students;
```
以上SQL语句将学生表按照成绩从高到低排序,并为每个学生分配row_number、rank和dense_rank。结果可能如下:
```
| name | score | row_num | rank_num | dense_rank_num |
|-------|-------|---------|----------|----------------|
| Tom | 90 | 1 | 1 | 1 |
| Jack | 85 | 2 | 2 | 2 |
| Alice | 85 | 3 | 2 | 2 |
| Lucy | 80 | 4 | 4 | 3 |
| Bob | 70 | 5 | 5 | 4 |
```
可以看到,Tom的成绩最高,所以他的row_number、rank和dense_rank都是1;Jack和Alice的成绩相同,所以他们的rank是2,但是dense_rank都是2;Lucy的成绩排在第4位,所以他的rank是4,但是dense_rank是3。Bob的成绩最低,所以他的row_number、rank和dense_rank都是5。
阅读全文