row_number和rank和dense_rank区别,画个表格
时间: 2024-02-07 19:04:23 浏览: 25
| 特性 | 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:为每一行分配一个唯一的数字,按照指定的排序顺序(默认是升序)进行排序。
- 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。
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
```