题解 | 没用NTH_VALUE

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

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

WITH
    user_time AS (
        SELECT
            exam_id,
            duration,
            release_time,
            tag,
            uid,
            TIMESTAMPDIFF (minute, start_time, submit_time) user_duration,
            ROW_NUMBER() OVER (
                PARTITION BY
                    tag
                ORDER BY
                    TIMESTAMPDIFF (minute, start_time, submit_time)
            ) time_rank,
            COUNT(1) OVER (
                PARTITION BY
                    tag,
                    exam_id
            ) num
        FROM
            exam_record
            JOIN examination_info USING (exam_id)
        WHERE
            submit_time IS NOT NULL
    )
SELECT
    t1.exam_id,
    t1.duration,
    t1.release_time
FROM
    (
        SELECT
            *
        FROM
            user_time
        WHERE
            time_rank = num -1
    ) t1
    INNER JOIN (
        SELECT
            *
        FROM
            user_time
        WHERE
            time_rank = 2
    ) t2 USING (exam_id)
WHERE
    (t1.user_duration - t2.user_duration) >= t1.duration / 2
order by
    t1.exam_id desc

先使用窗口函数计算每一tag分组的用时排名,这里要用row_number而不是dense_rank,因为题目中

解释:试卷9001被作答用时有50分钟、50分钟、30分1秒、11分钟、10分钟,第二快和第二慢用时之差为50分钟-11分钟=39分钟,试卷时长为60分钟,因此满足大于试卷时长一半的条件,输出试卷ID、时长、发布时间。

此外计算每一个tag完成试卷的人数,将来找第二慢的时候可以直接人数-1!!!!!!!!!!!

为了计算最2快和最2慢的差值,这里先按tag分别计算最2快表t1和最2慢的表t2,然后通过exam_id进行连接,在主查询没有使用tag是因为可能一个tag下有很多个试卷。

接下来就直接使用where来判定插值是否大于一半时间了,

这里用的minute是因为他能写出来,second也可以,但我不想改了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

全部评论

相关推荐

躺尸修仙中:因为很多92的也去卷中小厂,反正投递简历不要钱,面试不要钱,时间冲突就推,不冲突就面试积累经验
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-21 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务