dense_rank() over函数
时间: 2023-09-09 21:10:04 浏览: 102
`dense_rank()` over函数是在SQL中用于计算分组排名的函数,它返回一个整数值,表示每个分组内的排名。与`rank()`和`row_number()`不同的是,`dense_rank()`会跳过排名相同的行数,即如果有两个行具有相同的排名,则下一个排名将加1,而不是跳过相同排名的行数。
例如,假设有以下数据表:
```
id | name | score
----|---------|------
1 | Alice | 90
2 | Bob | 85
3 | Charlie| 90
4 | Dave | 80
```
可以使用`dense_rank()` over函数计算每个分数的排名:
```sql
SELECT name, score, dense_rank() over (ORDER BY score DESC) as rank
FROM students;
```
执行上述查询后,结果如下:
```
name | score | rank
------- | ----- | ----
Alice | 90 | 1
Charlie | 90 | 1
Bob | 85 | 2
Dave | 80 | 3
```
可以看到,由于Alice和Charlie的分数相同,他们都被分配了1的排名,而Bob的排名是2,因为他的分数是第二高的。而Dave的排名是3,因为他的分数是第三高的,而且没有其他分数相同的行。
相关问题
dense_rank() over函数 语法
dense_rank() over函数是一种窗口函数,它可用于计算分组中每个行的排名。语法如下:
```sql
dense_rank() over (
[partition by partition_expression, ... ]
order by sort_expression [asc | desc], ...
[frame_clause]
)
```
其中,`partition by`和`order by`子句是必需的,`frame_clause`是可选的。
- `partition by`:指定分组的列或表达式;
- `order by`:指定排序的列或表达式,也可以指定升序或降序;
- `frame_clause`:指定窗口的行范围。
如果没有指定`frame_clause`,则默认为`range between unbounded preceding and current row`,即计算当前行之前的所有行的排名。
例如,以下查询语句将计算每个部门中员工的排名:
```sql
SELECT department, employee, salary,
dense_rank() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees;
```
在此例中,`dense_rank`函数将按照部门分组,并按照工资的降序计算每个员工的排名。
DENSE_RANK函数
DENSE_RANK函数是一种窗口函数,用于计算排名。它根据指定的排序顺序对结果集中的行进行排序,并为每个行分配一个排名值。与RANK函数不同的是,DENSE_RANK函数在遇到相同的排序值时不会跳过排名,而是为它们分配相同的排名值。\[1\]
例如,如果有一张员工表,其中包含员工姓名和工资字段,我们可以使用DENSE_RANK函数来计算每个部门工资前三高的员工。首先,我们使用partition by子句将结果集按部门进行分组排序,然后使用order by子句按工资降序排列。最后,我们可以通过设置条件a.num<=3来筛选出每个部门的前三名员工。\[2\]
另外,DENSE_RANK函数的使用方式也可以简单地通过在查询中使用over子句和order by子句来实现。例如,我们可以使用DENSE_RANK函数计算一个表中某个字段的排名,并按照该字段的降序排列。\[3\]
#### 引用[.reference_title]
- *1* *3* [DENSE_RANK() 函数的使用](https://blog.csdn.net/libingbojava/article/details/121565515)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* [sql—窗口函数rank()、dense_rank()的使用](https://blog.csdn.net/qq_39181839/article/details/119853415)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文