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