##写的太复杂了,排行里的写法比较精简
##计算中位数的序号,一个或两个,根据序号找出>=序号的第一个成绩,根据辅助列最终确认成绩

select grade
from (

select grade,number,psum,tsum,mid1,mid2,f1,f2, row_number()over(partition by f1 order by grade) as rn1, row_number()over(partition by f2 order by grade) as rn2
from (
select grade,number,psum,tsum,mid1,mid2,
        case when psum>=mid1 then 1 else 0 end as f1,
        case when psum>=mid2 then 1 else 0 end as f2
from 
(
select grade,psum,tsum, number,case when  tsum% 2 =0 then 
                     tsum/2  
                   else 
                      ceil(tsum/2) end  as mid1
                      ,
                      case when  tsum% 2 =0 then 
                     tsum/2 +1  end as mid2
from 
(
select 
  grade , number , sum(number) over(order by grade) as psum
         ,sum(number) over() as tsum
from class_grade
) t 
)t
) t
)t  where (f1 =1 and rn1 =1 ) or(f2=1 and rn2 =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