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

最差是第几名(二)

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

#中位数:(总数+1)/2  左右边界
#加列等级 左右数边界
#判断中位数左、右边界在等级左右边界内 则标1

select
    grade
from (
         select
             grade
              ,case when lef_r>=l  and lef_r<=r then 1#中位数左边界在 等级排名区间
                    when rig_r>=l  and rig_r<=r then 1#中位数右边界在 等级排名区间
                    else 0 end t_f#含中位数的等级标1
         from (
                  select
                      a.grade
                       ,sum_r+1-number l#等级排名左数字
                       ,sum_r r#等级排名右数字
                       ,floor((n_sum+1)/2) lef_r#中位数左边界
                       ,floor(if(floor((n_sum+1)/2)=(n_sum+1)/2,(n_sum+1)/2,ceiling((n_sum+1)/2))) rig_r#中位数右边界
                  from (
                           select
                               *
                                ,(
                               select
                                   sum(number)
                               from class_grade
                           ) n_sum#总人数
                                ,sum(number)over(order by grade) sum_r
                           from class_grade
                       ) a
                  order by 1
              ) b#加列t_f筛选最终数据
     ) c
where t_f=1#筛选

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务