dense_rank 和rank
时间: 2024-01-12 19:04:01 浏览: 47
`RANK()`和`DENSE_RANK()`都是Oracle SQL中的分析函数,用于对查询结果进行排序并分配排名。两者的区别在于当存在相同的排序值时,`RANK()`会跳过相同的排名,而`DENSE_RANK()`会为相同的排序值分配相同的排名。
以下是两个函数的使用方法和示例:
1. `RANK()`
`RANK()`函数会为每个行分配一个排名,如果有多个行具有相同的排序值,则它们将被分配相同的排名,并且下一个排名将被跳过。例如,如果有两个行具有排名1,则下一个行将被分配排名3。
```sql
SELECT column1, column2, RANK() OVER (ORDER BY column1 DESC) as rank
FROM table_name;
```
2. `DENSE_RANK()`
`DENSE_RANK()`函数与`RANK()`函数类似,但是它不会跳过相同的排名,而是为它们分配相同的排名。例如,如果有两个行具有排名1,则下一个行将被分配排名2。
```sql
SELECT column1, column2, DENSE_RANK() OVER (ORDER BY column1 DESC) as dense_rank
FROM table_name;
```
相关问题
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。
rank dense_rank
这两个都是窗口函数中的排名函数,主要用于排序后对行进行编号。不同之处在于当值相同时,rank 会跳过相等的值,而 dense_rank 则不会跳过。
具体来说,假设有如下表格:
| id | score |
|----|-------|
| 1 | 90 |
| 2 | 80 |
| 3 | 90 |
| 4 | 70 |
使用 `rank()` 函数后,会得到以下结果:
| id | score | rank |
|----|-------|------|
| 1 | 90 | 1 |
| 2 | 80 | 2 |
| 3 | 90 | 1 |
| 4 | 70 | 4 |
可以看到,在第一、三行中,分数相等,因此它们的 rank 都是 1;而在第二行中,因为前面已经有一个分数比它高的行,因此它的 rank 是 2。注意第四行的 rank 不是 3 而是 4,这是因为排名函数默认升序排序。
使用 `dense_rank()` 函数后,会得到以下结果:
| id | score | dense_rank |
|----|-------|-----------|
| 1 | 90 | 1 |
| 2 | 80 | 2 |
| 3 | 90 | 1 |
| 4 | 70 | 3 |
可以看到,虽然第一、三行的分数相等,但 dense_rank 函数没有跳过它们,因此都是 1。另外,第四行的 dense_rank 是 3,这是因为前面有两个分数比它高的行。