题目描述
编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
提示:对于 MySQL 解决方案,如果要转义用作列名的保留字,可以在关键字之前和之后使用撇号。例如 `Rank`
题解
1 | select Score, DENSE_RANK() OVER(ORDER by Score DESC) as `Rank` from Scores |
sql排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)
排号从1开始,都需要有 over (order by …) 子句。https://www.cnblogs.com/52xf/p/4209211.html
案例:
ROW_NUMBER
根据over子句对某一列排序,按照over子句排序结果为查询出来的每一行记录生成一个序号,依次排号且不重复。
over子句与order by子句互不影响。如下sql语句,按照SubTime降序编号,结果按照TotalPrice降序返回:
1 | select ROW_NUMBER() OVER(order by [SubTime] desc) as row_num, * from [Order] order by [TotalPrice] desc |
可用于实现web分页。根据订单提交时间倒序排列获取第三至第五条数据:
1 | with orderSection as |
RANK
rank函数对于over子句中排序字段值相同的记录生成相同的序号,后面的记录的排号是基于当前的记录数,即:同一组的序号是一样的,下一组的序号是:上一组的序号+上一组的记录的数量-1.
1 | select RANK() OVER(order by [UserId]) as rank,* from [Order] |
DENSE_RANK
dense_rank与rank的区别在于dense_rank的排号是连续的,rank的排号可能不连续。在同一组中的记录排号相同。
1 | select DENSE_RANK() OVER(order by [UserId]) as den_rank,* from [Order] |
NTILE
ntile有一个参数用于指出桶数,将数据排序后进行装桶处理并编号。装桶及编号的规则:https://www.cnblogs.com/52xf/p/4209211.html