题目:

查询各个岗位分数的中位数位置上的所有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了。