题解 | 没用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也可以,但我不想改了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
查看12道真题和解析