rank和dense_rank区别
时间: 2024-12-18 18:11:44 浏览: 21
在SQL中,`RANK()` 和 `DENSE_RANK()` 都是窗口函数,用于对查询结果中的行进行排名,但它们之间有明显的差异:
1. **RANK()**:
- RANK() 函数会为每一行分配一个唯一的排名,即使存在相同的值,它们之间的排名顺序也是固定的。
- 当遇到并列的值时,排在后面的行会被分配更高的排名(即“跳跃式”排名)。
- 示例中的第2名和第3名可能会互换位置。
2. **DENSE_RANK()**:
- DENSE_RANK() 与 RANK() 相似,但它是连续的,不会因为并列而跳过任何排名,也就是说,如果有两个或更多相同的值,它们会保持原来的顺序,并依次递增。
- 它保证了相邻行之间的排名差距始终为1。
举个例子:
- RANK():
```sql
SELECT RANK() OVER (ORDER BY score) as rank
FROM students
```
结果可能是:1st, 2nd, 3rd, 4th, 5th, 6th (如果两名学生分数相同)。
- DENSE_RANK():
```sql
SELECT DENSE_RANK() OVER (ORDER BY score) as dense_rank
FROM students
```
结果可能是:1st, 2nd, 3rd, 3rd, 5th, 6th (如果两名学生分数相同)。
相关问题
row_number和rank和dense_rank区别,画个表格
| 特性 | ROW_NUMBER() | RANK() | DENSE_RANK() |
| --------------- | ------------ | -------------| --------------|
| 排序方式 | 按照ORDER BY | 按照ORDER BY | 按照ORDER BY |
| 序号唯一性 | 每行都有唯一值 | 有相同的值则跳过相同的值,不唯一 | 有相同的值则保留相同的值,不唯一 |
| 排名重复处理 | 不重复排名 | 重复排名 | 重复排名 |
| 例子 | SELECT ROW_NUMBER() OVER (ORDER BY age) as rownum FROM employee | SELECT RANK() OVER (ORDER BY salary DESC) as rank FROM employee | SELECT DENSE_RANK() OVER (ORDER BY department) as denserank FROM employee |
注:employee是示例表名,age、salary、department是示例字段名。
row_number和rank和dense_rank区别、,并举例
row_number、rank和dense_rank都是窗口函数,用于对查询结果进行排序并返回排序后的行号或排名。它们的主要区别在于如何处理并列排名的情况。
- row_number:按照指定的排序顺序为每一行分配一个唯一的行号,不考虑并列排名,即每行都有不同的行号。
举例:
```
SELECT name, score, ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num
FROM students;
```
结果:
```
name score row_num
Tom 90 1
Mike 85 2
John 85 3
Mary 80 4
```
- rank:按照指定的排序顺序为每一行分配一个排名,相同的行会得到相同的排名,但是会跳过相同排名的个数,即如果有两行并列排名第二,那么下一行的排名就是第四。
举例:
```
SELECT name, score, RANK() OVER (ORDER BY score DESC) AS rank
FROM students;
```
结果:
```
name score rank
Tom 90 1
Mike 85 2
John 85 2
Mary 80 4
```
- dense_rank:按照指定的排序顺序为每一行分配一个排名,相同的行会得到相同的排名,但是不会跳过相同排名的个数,即如果有两行并列排名第二,那么下一行的排名就是第三。
举例:
```
SELECT name, score, DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
FROM students;
```
结果:
```
name score dense_rank
Tom 90 1
Mike 85 2
John 85 2
Mary 80 3
```
阅读全文