select g.id, g.job, g.score,  t_rank
from (select * , count(1) over (partition  by job order by score desc ) as t_rank from grade) as g
right outer join 
(select job, 
(case when max(t_rank)%2=1 then  round((max(t_rank)+1)/2,0) else round(max(t_rank)/2,0) end) as start_rank,
(case when max(t_rank)%2=1 then  round((max(t_rank)+1)/2,0) else round(max(t_rank)/2+1,0) end) as end_rank
from (select * , count(1) over (partition  by job order by score desc) as t_rank from grade) as a
group by job
order by job) as b
on g.job = b.job
and g.t_rank = b.start_rank
union
select g.id, g.job, g.score,  t_rank
from (select * , count(1) over (partition  by job order by score desc ) as t_rank from grade) as g
right outer join 
(select job, 
(case when max(t_rank)%2=1 then  round((max(t_rank)+1)/2,0) else round(max(t_rank)/2,0) end) as start_rank,
(case when max(t_rank)%2=1 then  round((max(t_rank)+1)/2,0) else round(max(t_rank)/2+1,0) end) as end_rank
from (select * , count(1) over (partition  by job order by score desc) as t_rank from grade) as a
group by job
order by job) as b
on g.job = b.job
and g.t_rank = b.end_rank
order by id;

这样看或许很乱,但是,将临时表的表达写省略,再来剖析就简单了。

select g.id, g.job, g.score,  t_rank
from  g /*带有排名的临时表*/ right outer join  b/*中位数起始表*/
on g.job = b.job
and g.t_rank = b.start_rank
union /*union函数自动消除重复项*/
select g.id, g.job, g.score,  t_rank
from  g right outer join b
on g.job = b.job
and g.t_rank = b.end_rank
order by id;