SQL练习76:考试分数(五)

SQL练习76:考试分数(五)

题目链接:牛客网

题目描述
牛客每次考试完,都会有一个成绩表(grade),如下:
在这里插入图片描述
第1行表示用户id为1的用户选择了C++岗位并且考了11001分

第8行表示用户id为8的用户选择了B语言岗位并且考了9999分

请你写一个sql语句查询各个岗位分数的中位数位置上的所有grade信息,并且按id升序排序,结果如下:
在这里插入图片描述
解释:

第1行表示C++岗位的中位数位置上的为用户id为2,分数为10000,在C++岗位里面排名是第2

第2,3行表示Java岗位的中位数位置上的为用户id为4,5,分数为12000,13000,在Java岗位里面排名是第2,1

第4行表示B语言岗位的中位数位置上的为用户id为7,分数为11000,在前端岗位里面排名是第2


解法
1.根据 SQL练习75:考试分数(四)中的思想,我们可以获得每个job的中位数区间。

SELECT job, round(COUNT(id)/2) `start`, round((COUNT(id)+1)/2) `end`
FROM grade
GROUP BY job
ORDER BY job
jobstartend
B22
C++22
Java12

2.使用窗口函数row_number()job进行分区score进行降序排序,获取各个jobscore排名。

三个排序窗口函数的使用

SELECT *, row_number() over(PARTITION BY job ORDER BY score DESC) s_rank
FROM grade
idjobscores_rank
6B120001
7B110002
8B99993
1C++110011
2C++100002
3C++90003
5Java130001
4Java120002

3.之后将上面查询到的结果进行连接,查询s_rank在区间start, end之间的数据。之后按照id进行排序。

SELECT r2.*
FROM (SELECT job, round(COUNT(id)/2) `start`, round((COUNT(id)+1)/2) `end`
      FROM grade
      GROUP BY job
      ORDER BY job) r1
      JOIN
      (SELECT *, row_number() over(PARTITION BY job ORDER BY score DESC) s_rank
       FROM grade) r2
ON r1.job = r2.job AND r2.s_rank BETWEEN `start` AND `end`
ORDER BY r2.id
idjobscores_rank
2C++100002
4Java120002
5Java130001
7B110002
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream丶Killer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值