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

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

http://www.nowcoder.com/practice/b1e2864271c14b63b0df9fc08b559166

明确题意:

找到第二快和第二慢用时之差大于试卷时长的一半的试卷信息,按试卷ID降序排序


问题分解:

  • 统计每套试卷第二快和第二慢的用时及试卷信息,生成子表 t_exam_time_took:
    • 统计每次完成试卷的用时及试卷信息,生成子表 t_exam_record_timetook:
      • 关联试卷作答表和试卷信息表:exam_record JOIN examination_info USING(exam_id)
      • 筛选完成了的试卷:WHERE submit_time IS NOT NULL
      • 统计作答用时:TimeStampDiff(SECOND, start_time, submit_time) / 60 as time_took
    • 计算第二慢用时,取按试卷分区耗时倒排第二名:
      • NTH_VALUE(time_took, 2) OVER (PARTITION BY exam_id ORDER BY time_took DESC) as max2_time_took
    • 计算第二快用时,取按试卷分区耗时正排第二名:
      • NTH_VALUE(time_took, 2) OVER (PARTITION BY exam_id ORDER BY time_took ASC) as max2_time_took
  • 筛选第二快/慢用时之差大于试卷时长一半的试卷:WHERE max2_time_took - min2_time_took > duration / 2

细节问题:

  • 表头重命名:as
  • 按试卷ID降序排序:ORDER BY exam_id DESC

完整代码:

SELECT exam_id, duration, release_time
FROM (
    SELECT DISTINCT exam_id, duration, release_time,
        NTH_VALUE(time_took, 2) OVER (
            PARTITION BY exam_id ORDER BY time_took DESC) as max2_time_took,
        NTH_VALUE(time_took, 2) OVER (
            PARTITION BY exam_id ORDER BY time_took ASC) as min2_time_took
    FROM (
        SELECT exam_id, duration, release_time,
            TimeStampDiff(SECOND, start_time, submit_time) / 60 as time_took
        FROM exam_record JOIN examination_info USING(exam_id)
        WHERE submit_time IS NOT NULL
    ) as t_exam_record_timetook
) as t_exam_time_took
WHERE max2_time_took - min2_time_took > duration / 2
ORDER BY exam_id DESC;
SQL进阶 文章被收录于专栏

SQL进阶step by step

全部评论
这个NTH_VALUE也太棒了,少了一层套娃,感谢
3 回复 分享
发布于 2022-04-25 19:14
webary老大,请教一下,我看了 NTH_VALUE(expr, N)函数的定义:是返回第N行expr的值 如果说试卷9001的作答时间为[50分钟、50分钟、30分1秒、11分钟、10分钟] 那逻辑上第二快的数值应该是30分钟1秒,而不是两个同为第一快的50分钟,那根据 NTH_VALUE(time_took, 2)返回的数值第二行是50分钟,这样是否会存在逻辑不严谨,数值偏差的问题? (PS:题目最下面的解释中 '试卷9001被作答用时有50分钟、50分钟、30分1秒、11分钟、10分钟' 描述是错误的,我仔细翻查题目中试卷9001被作答用时是 '58分钟、50分钟、30分1秒、11分钟、10分钟',所以在该题中不存在同排名为1的情况,那么 NTH_VALUE(time_took, 2)函数使用是没有问题的,函数是好函数,学到了,但本题中使用似乎有点点疑问)
1 回复 分享
发布于 2022-08-13 12:52
NTH_VALUE()在网上我没看到什么特别好的讲解文章,您那边有吗,可以分享一下吗
点赞 回复 分享
发布于 2022-01-30 18:07
为什么USING(exam_id)改为on就会报错
点赞 回复 分享
发布于 2022-03-31 14:12
求问:最里面那个嵌套select exam_id不是用了内连接吗,不带表名前缀(exam_record.exam_id)为啥不报错呢?谢谢!
点赞 回复 分享
发布于 2022-04-20 22:20
求问line3为什么要distinct呀
点赞 回复 分享
发布于 2022-07-17 19:32
我觉得我是废物
点赞 回复 分享
发布于 2022-07-22 13:23
TimeStampDiff(SECOND, start_time, submit_time) / 60 as time_took, 这个除以60是什么意思啊,哪位大佬可以解答一下吗
点赞 回复 分享
发布于 2022-08-03 15:37

相关推荐

想去夏威夷的小哥哥在度假:5和6才是重点
点赞 评论 收藏
分享
38 7 评论
分享
牛客网
牛客企业服务