题解 | #第二快/慢用时之差大于试卷时长一半的试卷#

第二快/慢用时之差大于试卷时长一半的试卷

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

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 10:52
点赞 评论 收藏
分享
11-18 15:57
门头沟学院 Java
最终归宿是测开:这个重邮的大佬在重邮很有名的,他就喜欢打92的脸,越有人质疑他,他越觉得爽😂
点赞 评论 收藏
分享
HNU_fsq:建议直接出国,这简历太6了。自愧不如
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务