MySQL做题实战4||最差是第几名

简介:题目来自牛客网在线编程SQL实战,文章内容主要是讲解博主自己做题时的思路、相关见解以及要点总结。总的来说,路漫漫其修远兮,吾将上下而求索!

一、题目内容一(难度:简单)

TM小哥和FH小妹在牛客大学若干年后成立了牛客SQL班,班的每个人的综合成绩用A,B,C,D,E表示,90分以上都是A,80~90分都是B,60~70分为C,50~60为D,E为50分以下

因为每个名次最多1个人,比如有2个A,那么必定有1个A是第1名,有1个A是第2名(综合成绩同分也会按照某一门的成绩分先后)。

每次SQL考试完之后,老师会将班级成绩表展示给同学看。

现在有班级成绩表(class_grade)如下:

第1行表示成绩为A的学生有2个

.......

最后1行表示成绩为B的学生有2个

编写要求:

请写出一个SQL查询,如果一个学生知道了自己综合成绩以后,最差是排第几名? 结果按照grade升序排序,以上例子查询如下:

 解析:

第1行表示,学生成绩为A的知道自己最差为第2名

第2行表示,学生成绩为B的知道自己最差为第4名

第3行表示,学生成绩为C的知道自己最差为第6名

第4行表示,学生成绩为D的知道自己最差为第7名

解题思路:

解题代码:

select grade,sum(number)over(order by grade)
from class_grade;

比较总结:

  • 此题使用窗口函数可以轻松解决,当然也有比较复杂的解法,如使用case函数
    SELECT grade,
    (CASE grade WHEN 'A' THEN (SELECT SUM(number) FROM class_grade WHERE grade <='A') 
                WHEN 'B' THEN (SELECT SUM(number) FROM class_grade WHERE grade <='B')  
                WHEN 'C' THEN (SELECT SUM(number) FROM class_grade WHERE grade <='C')
                WHEN 'D' THEN (SELECT SUM(number) FROM class_grade WHERE grade <='D') 
                ELSE (SELECT SUM(number) FROM class_grade ) 
    END )AS t_rank
    FROM class_grade
    ORDER BY grade; 

 二、题目内容二(难度:较难)

TM小哥和FH小妹在牛客大学若干年后成立了牛客SQL班,班的每个人的综合成绩用A,B,C,D,E表示,90分以上都是A,80~90分都是B,60~70分为C,50~60为D,E为50分以下

因为每个名次最多1个人,比如有2个A,那么必定有1个A是第1名,有1个A是第2名(综合成绩同分也会按照某一门的成绩分先后)。

每次SQL考试完之后,老师会将班级成绩表展示给同学看。

现在有班级成绩表(class_grade)如下:

 第1行表示成绩为A的学生有2个

.......

最后1行表示成绩为D的学生有2个

编写要求:

老师想知道学生们综合成绩的中位数是什么档位,请写SQL帮忙查询一下,如果只有1个中位数,输出1个,如果有2个中位数,按grade升序输出,以上例子查询结果如下:

 解析:

总体学生成绩排序如下:A, A, B, B, B, B, C, C, C, C, D, D,总共12个数,取中间的2个,取6,7为:B,C

-------------以下解题参考讨论区的大佬,我自己做不出来,真是没想到T^T--------------------

解题思路:

 解题代码:

select grade from (select grade,(select sum(number) from class_grade) as total,
        sum(number) over(order by grade) a,
        sum(number) over(order by grade desc) b
        from class_grade) t1
where a >= total/2 and b >=total/2
order by grade;

比较总结:

  • 这道题涉及到开窗函数的使用,以及如何寻找中位数,真是一道好题(不枉我想了好久都没做出来,泪目T_T
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值