MQSQL01||分数排名

题目

在这里插入图片描述
编写 SQL 查询对分数进行排序。排名按以下规则计算:
1,分数应按从高到低排列;如果两个分数相等,那么两个分数的排名应该相同。
2,在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
3,按 score 降序返回结果表。

分析

1,按题意,首先需要对分数进行排名。
由于要求分数相同排名相同,故可以先按分数进行分组,过滤掉重复项,再基于这个结果按分数降序进行排名。
1)按分数进行分组,过滤掉重复项

select 
    score 
from 
    Scores 
group by 
    Scores.score 
order by 
    Scores.score desc

2)基于上述结果进行排名。其中,排名需要新增一个列,值为自增。

select 
    (@r:=@r+1) as temp, a.score 
from 
    (
        select 
            score 
        from 
            Scores 
        group by 
            Scores.score 
        order by 
            Scores.score desc
    ) a, 
    (
        select @r:=0
    ) r

2,接着,使用原表与步骤1得到的分数排名表建立一个左连接(关联条件为分数相等),并对连接后的表格按分数进行降序排序,即可得到最终结果

select 
    Scores.score, b.rank 
from 
    Scores 
left join 
    (
        select 
            CONVERT((@r:=@r+1), SIGNED) as 'rank', a.score 
        from 
            (
                select score from Scores group by Scores.score order by Scores.score desc
            ) a, 
            (
                select @r:=0
            ) r
    ) b 
on 
    Scores.score = b.score 
order by 
    Scores.score desc

测试

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值