SQL实战76.考试分数(五)

题目

SQL实战76.考试分数(五)

解答

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    -- 不同工作(job)里面的每个人的信息与排名

on (A.job=B.job  and B.t_rank between A.start and A.end)
order by B.id

-- 要提取中位数的信息,恰好A有中位数的信息,那么联立A,B表,并且当工作(job)相同
--并且, B的排名(rank)在A表的中位数位置之间,那么就表明这个信息是中位数的信息,最后联立
上一篇:Oracle学习(十四)分表分区


下一篇:终于明白矩阵的逆到底有什么用