题解 | #注册当天就完成了试卷的名单第三页#

注册当天就完成了试卷的名单第三页

http://www.nowcoder.com/practice/718d36d2667b48faa2168b6c1521816a

SQL43 注册当天就完成了试卷的名单第三页

题目主要信息:

  • 找到求职方向为算法工程师,且注册当天就完成了算法类试卷的人,按参加过的所有考试最高得分排名
  • 排名榜很长,采用分页展示,每页3条,取出第3页(页码从1开始)的人的信息

问题拆分:

  • 用户信息、试卷信息、考试信息分布在三个表中,我们需要依靠exam_id将exam_record表和examination_info e_i表连接在一起,然后依靠uid再连接上user_info表。知识点:join...on...
  • 对每个人的分数信息计算最大值,要以uid分组。知识点:group by
  • 筛选出每组职位是算法,试卷标签是算法且注册日期等于试卷提交日期的信息。知识点:where、date
  • 求最大分数。知识点:max
  • 根据最大分数排序。知识点:order by
  • 输出第三页,每页3条数据,及从第6条开始(0为起点),限制3条。limit 6, 3

代码:

select u_i.uid as uid,
       level, register_time,
       max(score) as max_score
from exam_record e_r join examination_info e_i
on e_r.exam_id = e_i.exam_id
join user_info u_i
on e_r.uid = u_i.uid
where job = '算法'
and tag = '算法'
and date(register_time) = date(submit_time)
group by uid
order by max_score desc 
limit 6, 3
孤帆远影碧空尽 文章被收录于专栏

牛客网各类题单题解~

全部评论
而且还不止,是按照注册日当天参加算法类考试最高得分排的名
2 回复 分享
发布于 2021-11-10 12:03
WITH a AS (SELECT er.uid, `level`,start_time,submit_time,score,tag,job,register_time, RANK () OVER (PARTITION BY uid ORDER BY score DESC) rk FROM exam_record er JOIN user_info ui ON er.uid= ui.uid JOIN examination_info ei ON ei.exam_id = er.exam_id) SELECT uid, `level`, register_time,score FROM a WHERE uid IN (SELECT uid FROM a WHERE DATE_FORMAT(register_time,'%Y%m') = DATE_FORMAT(submit_time,'%Y%m') AND job = '算法' AND tag = '算法') AND rk=1 ORDER BY score DESC LIMIT 6,3
1 回复 分享
发布于 2022-04-02 22:58
我也是这个写法竟然通过了,看了评论发现确实错了,抛开这个筛选条件的问题。 我有个疑问:请问为什么 group by uid 后,还能select level和register_time , 这样的写法是错误的吧?我在本地编译器写类似的语句报错的,不知道为什么在这跑通了。
7 回复 分享
发布于 2022-03-22 23:15
写得不对吧,题目要求是“按参加过的所有考试最高得分排名”,你这样写是“按照参加过的算法类考试最高得分排名”
6 回复 分享
发布于 2021-10-30 20:58
这个写法确实是错的,应该在WHERE先筛选出符合的uid,然后在求MAX的时候不能筛成tag = '算法' 。 答案:SELECT ui.uid, level, register_time, MAX(score) max_score FROM user_info as ui INNER JOIN exam_record as er ON ui.uid = er.uid INNER JOIN examination_info as ei ON ei.exam_id = er.exam_id WHERE job = '算法' AND DATE(register_time) = DATE(submit_time) AND ui.uid in ( SELECT DISTINCT ui.uid FROM user_info as ui INNER JOIN exam_record as er ON ui.uid = er.uid INNER JOIN examination_info as ei ON ei.exam_id = er.exam_id WHERE job = '算法' and tag = '算法' AND DATE(register_time) = DATE(submit_time) ) GROUP BY ui.uid ORDER BY max_score DESC LIMIT 3 OFFSET 6
3 回复 分享
发布于 2022-02-23 11:48
我也是这么写的 想问一下 select中有分组函数以外的属性并且也没有用聚合函数的, 为什么也可以通过啊
2 回复 分享
发布于 2022-04-23 11:37
最高分得单独从exam_record查找,不能加条件筛选
2 回复 分享
发布于 2021-12-26 12:00
select uid,level,register_time ,max(score) maxscore from user_info join exam_record using(uid) where uid in (select distinct exam_record.uid from user_info left join exam_record using(uid) join examination_info using(exam_id) where job = '算法' and tag = '算法' and date_format(register_time,'%Y%m%d') = date_format(submit_time,'%Y%m%d')) group by uid order by maxscore desc limit 6,3
点赞 回复 分享
发布于 2022-03-04 09:28
确实不对
点赞 回复 分享
发布于 2022-01-22 11:26

相关推荐

12-13 20:26
浙江大学 Java
淬月星辉:把浙大的校名加大加粗,把校徽再贴出来,就OK了
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

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