题解 | #考试分数(五)#
考试分数(五)
http://www.nowcoder.com/practice/b626ff9e2ad04789954c2132c74c0512
题目:
查询各个岗位分数的中位数位置上的所有grade信息,并且按id升序排序
思路:
1、各个岗位:按job分组,各岗位都有自己的排序——窗口函数 row_number()
2、中位数:参照上题,round(cnt/2) or rk=round((1+cnt)/2)
代码:
select id,job,score,rk
from
(select id,job,score,
row_number() over(partition by job order by score desc) as rk,
count(score) over(partition by job) cnt
from grade
)a
#where rk in if(cnt%2=0,cnt/2 or cnt/2+1,(cnt+1)/2)
where rk=round(cnt/2) or rk=round((1+cnt)/2)
order by id
反思:
1、一开始没想到用count,就想着看每个job个数用max(rk),但这样外层循环需要group by,然后就得vid,job,score,rk全放进去,做不出来;
2、判断中位数那里,还想着分cnt奇偶情况,做不出来,还是按照上一道题直接用round了。