1. 最差是第几名(一)
1.1 题目描述
TM小哥和FH小妹在牛客大学若干年后成立了牛客SQL班,班的每个人的综合成绩用A,B,C,D,E表示,90分以上都是A,8090分都是B,6070分为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名
1.2 语句实现
select grade, sum(number) over (order by grade) as t_rank
from class_grade
2. 最差是第几名(二)
2.1 题目描述
现在有班级成绩表(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
2.2 语句实现
-- 中位数:当某一数的正序和逆序累计均大于整个序列的数字个数的一半即为中位数
select grade
from (select grade,
(select sum(number) from class_grade) as total,
sum(number) over (order by grade) as a, -- 正序和
sum(number) over (order by grade desc) as b -- 逆序和
from class_grade) as cg
where a >= total/2 and b >= total/2
order by grade;