Sql排名函数☞DENSE_RANK
1、DENSE_RANK函数介绍
dense_rank函数用于返回结果集的分区内每行的排名,函数考虑到了over子句中排序字段值相同的情况,over子句中排序字段值相同的序号是一样的,后面字段值不相同的生成序号也是连续的。比如1、2、2、3。
相比较而言,另一个排名函数rank()与之类似,但是字段值不相同的序号将跳过相同的排名号排下一个,比如1、2、2、4。
dense_rank函数用法如下:
select DENSE_RANK() OVER(partition by column order by [UserId]) as den_rank,* from [Order]
需要注意的是:
- over()函数中的partition by表示排名基于根据column的分区,省略partition by代表当前排名的结果集分区是以整个表进行的 ;
- over子句中的order by子句与SQL语句中的order by子句没有任何关系(也区分DESC和ASC);
- over子句中的order by 要与Sql排序记录中的order by 保持一致,否则得到的序号可能不是连续的。
下面通过两个最近刷到的LC数据库习题来进行DENSE_RANK函数的讲解。
2、eg.1-第N高的薪水
编写一个 SQL 查询,获取 Employee
表中第 n 高的薪水(Salary)。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如上述 Employee
表,n = 2 时,应返回第二高的薪水 200
。如果不存在第 n 高的薪水,那么查询应返回 null
。
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200 |
+------------------------+
比较直观的一种方法,直接单表查询后使用limit N,1获取答案:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N := N-1;