#考试分数(五)#所谓中位数即无论升序倒序都处于中间的数

**题目描述:**sql语句查询各个岗位分数的中位数位置上的所有grade信息,并且按id升序排序

**个人思路:**所谓中位数,即无论升序还是倒序都处于中间的数。(๑•̀ㅂ•́)و✧

with t_rank as
(
    select *,
       count(score) over(partition by job) as total,
       row_number() over(partition by job order by score) as a, #升序序号
       row_number() over(partition by job order by score desc) as b #逆序序号
    from grade
)

select id,job,score,b
from t_rank
where a>=total/2 and b>=total/2
order by id

2023/03/14续

工作后偶然再次逛牛客,发现这么多然对这道题解放感兴趣。看了一下这道题解法确实有不严谨的地方,同一job存在多个score相同时,这里的row_number()正逆序号可能会出现问题,再加上id排序即可解决,感谢评论指出问题

with t_rank as
(
    select *,
       count(score) over(partition by job) as total,
       row_number() over(partition by job order by score,id) as a, #升序序号
       row_number() over(partition by job order by score desc,id desc) as b #逆序序号
    from grade
)

select id,job,score,b
from t_rank
where a>=total/2 and b>=total/2
order by id

牛客题霸-SQL篇【Mysql】 文章被收录于专栏

少壮不努力,老大勤刷题

全部评论
不大严谨,相同分数的 row_number 随机排序 一个job多人分数相同的话,这个方法,取的中位数位置上的用户,可能是他可能是她可能是一个可能是多个
2 回复 分享
发布于 2022-05-10 19:16
避免 row_number 随机排序,可以用order by score,id 加一个id排序就唯一了
2 回复 分享
发布于 2022-07-11 18:39
用dense_rank就完美解决了
1 回复 分享
发布于 2022-12-04 20:17 重庆
6
点赞 回复 分享
发布于 2023-10-03 15:21 江苏
这方法挺巧妙的,但如果有同岗位的重复分数的话就会少取或多取一个id,应该先按job,score聚合一下去重,然后用你的方法找到各岗位的中位数分数,再去原表里按找到的分数提取所有符合要求的id信息
点赞 回复 分享
发布于 2022-05-05 00:31
人才!
点赞 回复 分享
发布于 2022-02-04 10:30
牛呀,这个做法很别致
点赞 回复 分享
发布于 2021-07-30 12:16

相关推荐

LZStarV:冲就好了,就算真的是字节也冲,面评脏了大不了等三四个月就淡了,而且等到那个时候实力进步了选择还多,何必拘泥于字节
点赞 评论 收藏
分享
notbeentak...:就抓,嗯抓,开不开匿名都要抓,一点坏事不让说,就对公司顶礼膜拜佩服的五体投地就对了
点赞 评论 收藏
分享
评论
103
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务