SQL88 牛客网练习 巧求中位数

SQL88 牛客网练习

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

方法1:
对于如何求中位数 :我们可以把number 正着加一遍 再反着加一遍 大于一半的就是

方法2:
普通方法求中位数,再按照各个grade起始位置和终止位置匹配

-- 方法1
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;

-- 方法2
select a.grade grade ,a.m,a.n,c.s,c.e from
(
    select grade,n-number+1 as m,n from
    (select grade,number,sum(number) over(order by grade) as n from class_grade)d
)a,
(
    select
        case when an%2=1 then round((an+1)/2,0) else round(an/2,0) end s,
        case when an%2=1 then round((an+1)/2,0) else round(an/2+1,0) end e
    from(select sum(number) an from class_grade) b
)c
where s between a.m and a.n or e between a.m and a.n
order by grade
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值