题解 | #最差是第几名(二)#

最差是第几名(二)

http://www.nowcoder.com/practice/165d88474d434597bcd2af8bf72b24f1

select grade
from
    (select grade,`end`,`end`-number+1 `start`,(select sum(number) from class_grade) total
    from 
        (
         select grade,number,sum(number) over (order by grade) `end`
         from class_grade
         where number>0
        ) a
     ) b
where (case when total%2=1 then (total+1)/2 else total/2 end) between `start` and `end`
or (case when total%2=1 then (total+1)/2 else total/2+1 end) between `start` and `end`;


思路:之前做过一个题找中位数的题,运用那个题的思路寻找中位数所在的区间,比如,1,2,3中位数区间为[2,2],而1,2,3,4的中位数区间是[2,3]进而判断中位数值

但此题和之前的不太一样,这两个数并不在表格中,而是包含在表格的里面需要加个判断以判断是否处在这个区间
第一步:查询出每个区间的范围,以start和end表示
                下限:用窗口函数取向上累加
                上限:下限-每个区间包含个数+1
select grade,`end`,`end`-number+1 `start`,(select sum(number) from class_grade) total   #start为上限,total为总个数,用于下一层的计算中位数
    from 
        (
         select grade,number,sum(number) over (order by grade) `end`   #end为下限
         from class_grade
         where number>0
        ) a
第二步:计算中位数区间,case when分奇偶计算即可
case when total%2=1 then (total+1)/2 else total/2 end    #中位数左区间
case when total%2=1 then (total+1)/2 else total/2+1 end  #中位数右区间 
第三步:判断中位数区间在那个范围,between...and判断中位数所在范围,筛选出所在grade
注意:此筛选用or连接的原因是,两个中位数存在不同区间应并集,该步筛选同样起到了去重的作用,因此grade前不需要加distinct即可,比如总数为奇数的中位数区间为同一个数,两个记录相同,并集取其一
where (case when total%2=1 then (total+1)/2 else total/2 end) between `start` and `end`
or (case when total%2=1 then (total+1)/2 else total/2+1 end) between `start` and `end`;

全部评论

相关推荐

面试体验极其糟糕,是个中年秃头老男人。 全程心不在焉漫不经心,问完一个问题沉默两三分钟才问下一个。 面一半我都想直接退出会议了,或许每个公司都有逆天面试官吧。 过了好几天复盘看录音写下这篇面经的时候, 我都能感受到当时的我怨气有多大。 面经 base 北京 核心本地商业-到家研发平台 移动端适配方案 rem / em / vw 的含义与区别 使用 vw 时有没有考虑过兼容性问题 watch 与 watchEffect 的区别 Vue data 为什么要返回一个函数?不是函数会有什么问题 setup 是如何实现类似选项式 API 的能力的?怎么访问到 props 和响应式数据与方法的 pro...
在写周报的卡尔很优秀:美团第一挂的时候手撕没写出来,面试官提醒我下次手撕可以先问下能不能用本地ide,他们都是允许用的,复活赛也是碰到一个逆天面试官,前面八股啥的提问一直心不在焉,回答的时候小声嘟囔,发出不满的咂嘴声。这些我都忍,不过最后手撕时我问能不能用本地ide,逆天的来了,“你为什么要用本地ide?”“你是不是基础不行,校招学生连这些接口都记不住吗?我觉得校招生要有这样的能力”“如果没有ide你就不编码了吗?” 行行行,那我直接用网页写,逼网页什么代码提示都没有,就嗯写,写完运行出现一个错误,显示Arraylist 这个符号未定义,我以为是没引入,自己手动引入了,结果还是不行,最后发现是写成了Arrayslist,然后又开始了 “这也能写错,校招生这个水平都没有吗?” 代码一次运行就ac之后接着说 “我怎么知道你的算法能力,这题有可能是你背下来的”我解释自己的代码思路 “你别说话,能不能给人时间看代码”,,好好好好,这老登真令人无语
点赞 评论 收藏
分享
牛客746145331号:没有自知之明,还优中选优上了,单位是有多好?别人优秀的你发了offer别人就会来?别到时候offer全被鸽了又要重新招聘,什么样的公司招什么样的认,不要想着低工资能招个多优秀的人
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务