【SQL】中位数位置分数信息

考试分数(五)

http://www.nowcoder.com/questionTerminal/b626ff9e2ad04789954c2132c74c0512

查询各个岗位分数的中位数位置上的所有grade信息,并且按id升序排序。
思路:

  1. 使用row_number()join找到按照成绩排序后,row_number = 中位数位置的分数;
  2. 中位数位置结合floor()函数向下取整,ceiling()向上取整进行计算。

中位数位置:
eg1.每个岗位(job)对应的成绩总个数为4,那么中位数位置为2,3;
eg2.每个岗位(job)对应的成绩总个数为5,那么中位数位置为3;

每个岗位(job)对应的成绩总个数计算:count(id) group by job

因此得到中位数位置可表示为floor((count(id) + 1)/ 2), ceiling((count(id) + 1)/ 2)

select 
    id
    ,g.job as job
    ,score
    ,rk
from (--分数排名计算
    select 
        id
        ,job
        ,score
        ,row_number() over(
            partition by job
            order by score desc
        ) as rk
    from grade 
) g

left join (--中位数位置计算
    select
        job
        ,floor((count(id) + 1)/ 2) as m1
        ,ceiling((count(id) + 1)/ 2) as m2
    from grade
    group by job
) m

on g.job = m.job

where rk between m1 and m2          -- 过滤,保证row_number处于中位数位置

order by id
;
全部评论
row_number() over(partition by job order by score desc) as rk 为什么这里一定要用倒序,不用倒序还通不过?
点赞 回复 分享
发布于 2021-04-07 22:06
你不用倒序,那个每组的排名就不对了,就是是rk 这个列就得数值就 ,举个例子,本来Java的那一组 的按score 排序正序是12000,1;13000 2,但是预计的结果是倒序的,应该是13000,1;12000,2
点赞 回复 分享
发布于 2021-09-28 23:27

相关推荐

安静的垂耳兔在泡澡:ks已经第八次投递了,它起码挂了还让你再投,不错了
点赞 评论 收藏
分享
我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
评论
31
收藏
分享
牛客网
牛客企业服务