排序函数 || 对所有员工的薪水按照salary降序进行1-N的排名
对所有员工的薪水按照salary降序进行1-N的排名
http://www.nowcoder.com/practice/b9068bfe5df74276bd015b9729eec4bf
1 题解Code
select
emp_no,
salary,
DENSE_RANK()over(order by [salary] desc) as t_rank
from salaries
order by t_rank asc,emp_no asc;
2 排序函数总结 row number/rank/dens_rank
2.1 row_number()
row number 为查询出来的每一行记录生成一个序号(先排序,再给序号),依次排序且序号不会重复
函数形式
select ROW_NUMBER() OVER(order by [column name] desc) as row_num,* from [Table name]
- over(order by [column name] desc) 中要基于某一column进行排序,在此基础上生成序号
Use Case
按照salary降序排序,row_num 为其对应的序号(排序序号不重复)
select ROW_NUMBER() OVER(order by [salary] desc) as row_num,* from salary
2.2 rank()
rank函数就是对查询出来的记录进行排名,与row_number函数不同的是,rank函数考虑到了over子句中排序字段值相同的情况,如果使用rank函数来生成序号,over子句中排序字段值相同的序号是一样的。
函数形式
select rank() OVER(order by [column name] desc) as row_num,* from [Table name]
Use Case
按照salary降序排序,row_num 为其对应的序号,相同的值对应的排序序号相同,如有n个值相同,其对应排序为m,则下一个不相等的值对应的序号为m+n。如工资降序排序 7000为第二高工资,有两个人,则下一个6900对应的序号为4(前4个人的序号为1、2、2、4)
select rank() OVER(order by [salary] desc) as row_num,* from salary
2.3 dense_rank()
与rank函数相同的是dens_rank在排序时相同值对应的序号相同,不同点是dens_rank给出的序号是连续的,如上情况,dens_rank对应的序号结果为1、2、2、3
函数形式
select dense_rank() OVER(order by [column name] desc) as row_num,* from [Table name]