select
id,
a.job,
score,
t_rank
from
(select
id,
job,
score,
row_number() over(partition by job order by score desc) as t_rank
from
grade ) a
left join
(
select
job,
floor(if(count(*)%2=0, count(*)/2, (count(*)+1)/2)) as start,
floor(if(count(*)%2=0, count(*)/2+1, (count(*)+1)/2)) as end
from
grade
group by
job
order by
job
) b
on a.job = b.job and a.t_rank >= b.start and a.t_rank <= b.end
where b.job is not null
order by id

京公网安备 11010502036488号