SQL做题日志4||最差是第几名

285 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

🔖文章摘要

题目选自牛客网在线编程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)

📌解题思路

『注:此题我想了很久都做不出来,解题思路参考了评论区的大佬做的』

image.png

整理如下图示:

📌解题代码

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;

📌要点总结

  • 这道题涉及到开窗函数的使用,以及如何寻找中位数,需要理解中位数的特性,解题思路十分巧妙,真是一道好题😜