大牛解法)
- 按id升序排序
select B.* from (SELECT job,FLOOR((COUNT(*)+1)/2) AS `start`,FLOOR((COUNT(*)+1)/2)+if(COUNT(*) % 2=1,0,1) AS `end` FROM grade GROUP BY job) A -- 求出如上题的中位数区间 JOIN (select g1.*, ( select count(distinct g2.score) from grade g2 where g2.score>=g1.score and g1.job=g2.job) as t_rank from grade g1 ) B on (A.job=B.job and B.t_rank between A.start and A.end) -- 成绩位于中位数区间 order by B.id
21/4/2
第二次修改,自己的做法,感觉更好理解
select a.id, b.job, a.score , a.t_rank from (select job, floor((count(score)+1)/2) as 'start', floor((count(score)+2)/2) as 'end' from grade group by job)b join (select id, job, score, dense_rank()over(partition by job order by score desc) t_rank from grade)a on b.job = a.job where a.t_rank between b.start and b.end order by a.id asc ;