题解 | #最差是第几名(二)#
最差是第几名(二)
http://www.nowcoder.com/practice/165d88474d434597bcd2af8bf72b24f1
k 获取范围 j获取中位数 然后判断范围在start~t_rank之间标记为1
select h.grade from (
select k.grade,
k.number,
k.t_rank,
k.start,
j.mid1,
j.mid2,
case when (j.mid1 >= k.start and j.mid1<= k.t_rank) or (j.mid2 >= k.start and j.mid2<= k.t_rank) then 1 else 0 end as flag
from (
select t1.grade,
t1.number,
t2.t_rank,
t2.t_rank - t1.number + 1 as start
from (select grade,number from class_grade order by grade) t1
left join (select grade,sum(number) over(order by grade ) t_rank from class_grade order by grade) t2
on t1.grade = t2.grade
) k
left join (
select case when sum(number)%2 = 0 then round(sum(number)/2,0) else round((sum(number)+1)/2,0) end as mid1,
case when sum(number)%2 = 0 then round(sum(number)/2 + 1,0) else round((sum(number)+1)/2,0) end as mid2
from class_grade
) j
on 1 = 1
) h
where h.flag = 1
order by h.grade;