题解 | #第二快/慢用时之差大于试卷时长一半的试卷#
第二快/慢用时之差大于试卷时长一半的试卷
https://www.nowcoder.com/practice/b1e2864271c14b63b0df9fc08b559166
step1: 通过一个内连接将两个表连接起来同时过滤掉一些杂七杂八的数据。
step2:根据exam_id分区开两个窗口,一个窗口用来统计最快完成的记录排名,一个窗口用来统计最慢完成的记录排名。
同时吧该条记录的 usedSeconds查询出来,把外层查询需要用得字段填上
step3: 过滤出第二慢和第二快的记录,按照exam_id分组,按照题目给出分出条件:第二慢的记录的usedSeconds和第二快的记录的usedSeconds之差大于试卷时长的一半(注意这里的试卷时长用得是分钟,转一下秒)的试卷信息。
在最后分组过程中为什么用max,min 这些聚合函数应该大家都明白。不做说明。
#分析 : 第二快:某张卷子,最快完成的作答记录。第二慢:某张卷子,最快完成的作答记录 select c.exam_id, max(c.duration) as duration,max(c.release_time) as release_time from ( select a.exam_id, UNIX_TIMESTAMP(a.submit_time) - UNIX_TIMESTAMP(a.start_time) as usedSeconds, b.duration, b.release_time, row_number() over(partition by a.exam_id order by (UNIX_TIMESTAMP(a.submit_time) - UNIX_TIMESTAMP(a.start_time)) ) as fastSpeed, row_number() over(partition by a.exam_id order by (UNIX_TIMESTAMP(a.submit_time) - UNIX_TIMESTAMP(a.start_time)) desc ) as lowSpeed from exam_record a join examination_info b on a.exam_id = b.exam_id where a.submit_time is not null ) c where c.fastSpeed = 2 or c.lowSpeed = 2 group by c.exam_id having max(c.usedSeconds) - min(c.usedSeconds) > max(c.duration*60)/2 order by c.exam_id desc