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

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

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

第一步:先把所有记录的时间差及其大小顺序计算出来 第二步:找到每个exam第二快kuai_2和第二慢man_2的时间差 第三步:将第二步找到的kuai_2-man_2计算出来,找到大于0.5的duration的数据


select e.exam_id,e.duration,release_time
from 
(
    select t.exam_id
    ,max(case when r1=2 then time_diff end) as kuai_2
    ,max(case when r2=2 then time_diff end) as man_2
    from 
    (
        SELECT *
        ,TIMESTAMPDIFF(MINUTE,submit_time,start_time) as time_diff
        ,dense_rank() 
        over(partition by exam_id order by TIMESTAMPDIFF(MINUTE,submit_time,start_time) desc) as r1
        ,dense_rank() 
        over(partition by exam_id order by TIMESTAMPDIFF(MINUTE,submit_time,start_time)) as r2
        from exam_record
        where submit_time is not null
    ) t 
    group by t.exam_id
) t 
join examination_info e 
on e.exam_id=t.exam_id
where (kuai_2-man_2)>=0.5*duration
order by t.exam_id desc;
全部评论
厉害,还组合了case函数
点赞 回复 分享
发布于 2021-12-17 16:31
这里时间差最好精确到秒比较好,试卷时长可以乘以60
点赞 回复 分享
发布于 2021-12-17 16:33
select t.exam_id ,max(case when r1=2 then time_diff end) as kuai_2 ,max(case when r2=2 then time_diff end) as man_2 请问 为啥用max啊,是有重复的意思吗
1 回复 分享
发布于 2022-01-04 14:03
牛啊牛啊
点赞 回复 分享
发布于 2021-11-10 16:10
其实这里max(case when)的用法一开始没看明白,运行后发现其实max在这也就是为了使两个cost_time能联结起来,否则group by聚合函数使用后没法联结。一般而言我们考虑的都是重复操作生成两个方向的表联结了,这样确实繁琐,所以楼主这个group by加max的用法使得两个cost_time能够连接起来确实奇思妙想。
点赞 回复 分享
发布于 2022-02-27 15:56
r1是desc不应该是慢吗?因为时间越长越慢啊,r2是升序的,是快,求指教
点赞 回复 分享
发布于 2022-03-31 22:12

相关推荐

联通 技术人员 总包不低于12
点赞 评论 收藏
分享
10-29 15:38
门头沟学院 Java
榕城小榕树:难道你简历里写了配送路径优化算法?
点赞 评论 收藏
分享
13 3 评论
分享
牛客网
牛客企业服务