sql中ROW_NUMBER()和RANK()和DENSE_RANK()函数

ROW_NUMBER()函数

假设有如下的 employees 表:

+----+-------+--------+
| id | name  | salary |
+----+-------+--------+
|  1 | Alice |   5000 |
|  2 | Bob   |   6000 |
|  3 | Carol |   5000 |
|  4 | Dave  |   4000 |
+----+-------+--------+

如果使用 ROW_NUMBER() 函数计算排名,那么查询语句可以写成:

SELECT name, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employees;

执行结果如下:

+-------+--------+--------+
| name  | salary | row_num|
+-------+--------+--------+
| Bob   |   6000 |      1 |
| Alice |   5000 |      2 |
| Carol |   5000 |      3 |
| Dave  |   4000 |      4 |
+-------+--------+--------+

RANK()

如果希望在相同薪水的情况下产生连续的排名,可以使用 RANK() 函数

SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS rank_num
FROM employees;

-- 执行结果如下
+-------+--------+---------+
| name  | salary | rank_num|
+-------+--------+---------+
| Bob   |   6000 |       1 |
| Alice |   5000 |       2 |
| Carol |   5000 |       2 |
| Dave  |   4000 |       4 |
+-------+--------+---------+

DENSE_RANK()

如果希望在相同薪水的情况下返回相同值的并列排名,可以使用 DENSE_RANK() 函数

SELECT name, salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank_num
FROM employees;

-- 执行结果如下
+-------+--------+---------------+
| name  | salary | dense_rank_num|
+-------+--------+---------------+
| Bob   |   6000 |             1 |
| Alice |   5000 |             2 |
| Carol |   5000 |             2 |
| Dave  |   4000 |             3 |
+-------+--------+---------------+

总结

ROW_NUMBER()函数对于相同成绩,会生成连续排序,两人都是10分,一个是第二名,一个是第三名。

RANK()函数对于相同成绩,排名会重复,并且丢弃一个排名,两个人都是10分,两个都是第二名,没有第三名,直接到第四名。

DENSE_RANK()函数对于相同成绩,排名会重复,不会丢失排名,两人都是10分,两个都是第二名,下一名是第三名。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值