【方法一】
关键点1
扩充原表的字段,字段1【row_number】 按job分类用row_number升序排序;字段2【count】按job分类计数
关键点2
筛选位于中位数的信息:abs(t1.s_rank-(t1.num+1)/2)<1
select id,job,score,s_rank from (select * ,(row_number()over(partition by job order by score desc))as s_rank ,(count(score)over(partition by job))as num from grade)t1 where abs(t1.s_rank-(t1.num+1)/2)<1 order by id;
【方法二】
关键点1
用自联结:g表用row_number扩充了排序列;m表是求中位数的开始和结束的位数,用floor和ceiling
关键点2
筛选位于中位数的信息:rk between m1 and m2,或abs(rk-(m1+m2)/2)<1
select id,g.job as job, score, rk from (select id,job,score, row_number() over(partition by job order by score desc ) as rk from grade ) g left join (select job,floor((count(id) + 1)/ 2) as m1, ceiling((count(id) + 1)/ 2) as m2 from grade group by job ) m on g.job = m.job where rk between m1 and m2 order by id;