题目:
编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):
解题思路:
由于mysql没有窗口函数,这道题可以使用上文提到的用户变量 @rank 来实现。
select Score,Rank from (
SELECT score,
@rank:= if(@pre=score, @Rank+0, @Rank+1) as Rank,
@pre:= score
FROM scores,
(SELECT @rank:=0, @pre:= NULL) r
ORDER BY score desc
) t
解释下这段代码:
(1)变量赋值
SELECT @rank:=0, @pre:= NULL
前面我们提到过,给自定义变量赋值有2种方法,一种是用set,另一种使用select。而且赋值推荐使用:=这种方式。这里定义两个变量, @rank 用于获取排名值,初始值为0;@pre用于存放上一条分数并与本条记录中的分数作比较,初始值为null。在这一串代码中,这个赋值语句会最先执行。
(2)分数比较