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

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

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

思路:
给完成时间(submit_time)和(start_time)的 差 排序,然后只保留正序为 2 或者 倒序为 2 的信息

使用函数:
求时间差 timestampdiff(second,start_time,submit_time)
排序 row_number()

1.首先给原来的exam_record表加入时间差的正序倒序 以及 时间差 ,同时排除完成时间为空(Null)的信息,partiton by exam_id根据考试编号聚合
select *,timestampdiff(second,start_time,submit_time) tm,
row_number() 
    over(partition by exam_id order by timestampdiff(second,start_time,submit_time) desc) rk1,
row_number() 
    over(partition by exam_id order by timestampdiff(second,start_time,submit_time) ) rk2
from exam_record
where submit_time is not null 
2.链接考试信息表,并保留序号为2的所有信息
select exam_id,duration,release_time from 
(select *,timestampdiff(second,start_time,submit_time) tm,
row_number() 
    over(partition by exam_id order by timestampdiff(second,start_time,submit_time) desc) rk1,
row_number() 
    over(partition by exam_id order by timestampdiff(second,start_time,submit_time) ) rk2
from exam_record
where submit_time is not null ) t join examination_info using(exam_id)
where rk1 = 2 or rk2 = 2
3.因为第二步只有序号为2的信息,所以用考试编号(exam_id)聚合,然后用大的时间减去小的时间就好了(PS:因为之前计算时间差单位是用的秒,所以duration要乘以60)
group by exam_id 
having max(tm)-min(tm) > duration * 0.5 *60
order by exam_id desc
最后是完整代码
select exam_id,duration,release_time from 
(select *,timestampdiff(second,start_time,submit_time) tm,
row_number() 
    over(partition by exam_id order by timestampdiff(second,start_time,submit_time) desc) rk1,
row_number() 
    over(partition by exam_id order by timestampdiff(second,start_time,submit_time) ) rk2
from exam_record
where submit_time is not null ) t join examination_info using(exam_id)
where rk1 = 2 or rk2 = 2
group by exam_id 
having max(tm)-min(tm) > duration * 0.5 *60
order by exam_id desc





#题解#
全部评论
好使 易懂
点赞 回复 分享
发布于 2024-01-25 22:01 新疆

相关推荐

03-19 10:07
已编辑
广东药科大学 Java
Yki_:你倒是进一个面啊
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务