0%

分数排名

题目描述

编写一个 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
2
3
4
5
with orderSection as
{
select ROW_NUMBER() OVER(order by [SubTime] desc) rownum, * from [Order]
}
select * from [orderSection] where rownum between 3 and 5 order by [SubTime] desc

RANK

rank函数对于over子句中排序字段值相同的记录生成相同的序号,后面的记录的排号是基于当前的记录数,即:同一组的序号是一样的,下一组的序号是:上一组的序号+上一组的记录的数量-1.

1
select RANK() OVER(order by [UserId]) as rank,* from [Order]

使用rank函数排名-晓菜鸟

DENSE_RANK

dense_rank与rank的区别在于dense_rank的排号是连续的,rank的排号可能不连续。在同一组中的记录排号相同。

1
select DENSE_RANK() OVER(order by [UserId]) as den_rank,* from [Order]

使用dense_rank函数排名-晓菜鸟

NTILE

ntile有一个参数用于指出桶数,将数据排序后进行装桶处理并编号。装桶及编号的规则:https://www.cnblogs.com/52xf/p/4209211.html