第一步计算每个岗位的中位数位置,用floor函数,即 SELECT job, FLOOR((COUNT(job) + 1) / 2) AS start, FLOOR((COUNT(job) + 2) / 2) AS end FROM grade GROUP BY job 第二步,运用窗口函数按照分数降序给岗位排序,即 RANK() OVER (PARTITION BY g.job ORDER BY g.score desc) AS t_rank, 第三步,将以上两步的结果用INNER JOIN链接形成一个新表,再select出需要显示的字段,并用WHERE sr.t_rank = sr.start OR sr.t_rank = sr.end进行筛选,最后对于结果进行id排序,即 SELECT sr.id, sr.job, sr.score, sr.t_rank FROM ( SELECT g.id, g.job, g.score, RANK() OVER (PARTITION BY g.job ORDER BY g.score desc) AS t_rank, r.start, r.end FROM grade g INNER JOIN ( SELECT job, FLOOR((COUNT(job) + 1) / 2) AS start, FLOOR((COUNT(job) + 2) / 2) AS end FROM grade GROUP BY job ) AS r ON g.job = r.job ) AS sr WHERE sr.t_rank = sr.start OR sr.t_rank = sr.end order by sr.id