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

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

看了那么多大神解法,对于我这种算法弱智来说真跟不上,分享一个最傻瓜式,最易懂的方法吧。
题目要求找出中位数:总数基数输出1个,总数偶数输出2个
思路:延用上一题的题解,找到每个grade的最后一名的排名,观察这个最差排名是否包含中位数,包含则输出。
步骤:
1.查询每个grade的最差排名(同上一题)

with t0 as(
    select grade, number, sum(number)over(order by grade)num
    from class_grade
)

2.将总数分奇偶数进行判断:当总数是奇数时,利用limit=1,取出1个grade;

b as(
    select grade,num
    from t0
    where t0.num >= (select sum(number) from class_grade)/2
    order by num
    limit 1
)

当总数是偶数时,再分情况判断:如果grade的最差排名数 >= 总数/2 + 1,则只输出1个grade;grade的最差排名数 >= 总数/2 输出2个grade

a as(
    select grade,num
    from t0
    where t0.num >= (select sum(number) from class_grade)/2
    order by num
    limit 2
),
,
c as(
    select grade,num
    from t0
    where t0.num >= (select sum(number) from class_grade)/2+1
    order by num
    limit 1
)

3.最后取出中位数grade,将以上a,b,c三个表左连接,通过ifnull函数剔除联表查询中的空值

select ifnull(case when (select sum(number) from class_grade)%2=0 //取模判断奇偶
              then (case when a.num >=(select sum(number) from class_grade)/2+1 //判断总数为偶数时两个中位数是否均在同一个grade中
                   then c.grade//是的话取其中1个
                   else a.grade end)//不是的话取2个
              else b.grade end, '')
from a left join b on a.grade = b.grade
        left join c on a.grade = c.grade
全部评论

相关推荐

霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务