题解 | 没用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也可以,但我不想改了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!