自己的代码弱爆了,就不写思路了。牛逼的代码可以参考高赞回答。 select grade from( select grade, if(c >bb and c<=b or d>bb and c<=b,1,0) as e from( select grade, lag(b,1)over(order by b) bb, b, ceil(if(a%2=0,a/2,(a+1)/2)) c, ceil(if(a%2=0,a/2+1,(a+1)/2)) d from( select *, sum(number)over() a, sum(number)over(order by grade) b from class_grade) as tb1 ) as tb2 ) as tb3 where e=1 order by grade