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

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

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

明确题意:

找到第二快和第二慢用时之差大于试卷时长的一半的试卷信息,按试卷ID降序排序

问题拆解:

  • 本题主要是考察知识点:row_number()、timestampdiff等
  • t3是第二快的记录,t4是第二慢的记录
  • timestampdiff求出差值,记得用秒才准确,用minute不准确!!得到t5
  • t5与t6关联,筛选出结果。

代码实现:

select 
t6.exam_id,
t6.duration,
t6.release_time
from 
(
    SELECT t3.exam_id,t4.long_time - t3.long_time as diff_long_time  -- 求出差值
    from (
        select * from (
            select * ,
            row_number() over(partition by exam_id order by long_time asc) as row_num -- 用秒 才准确!!
            from (
            select * , 
            TIMESTAMPDIFF(second,start_time,submit_time) as long_time
            from exam_record where submit_time is not null 
            )t1
         )t2 where row_num = 2  
    )t3 -- 第2快
    join (
        select * from (
            select * ,
            row_number() over(partition by exam_id order by long_time desc) as row_num
            from (
            select * , 
            TIMESTAMPDIFF(second,start_time,submit_time) as long_time
            from exam_record where submit_time is not null 
            )t1
        )t2 where row_num = 2  
    )t4 -- 第2慢
    on t3.exam_id = t4.exam_id 
)t5 
join examination_info t6 
on t5.exam_id = t6.exam_id 
where t5.diff_long_time > t6.duration*60 / 2  -- 筛选
order by t6.exam_id desc ;

中间过程:

mysql>  select * from (
    ->         select * ,
    ->         row_number() over(partition by exam_id order by long_time asc) as row_num
    ->         from (
    ->         select * , 
    ->         TIMESTAMPDIFF(second,start_time,submit_time) as long_time
    ->         from exam_record where submit_time is not null 
    ->         )t1
    ->      )t2 where row_num = 2  
    -> ;
+----+------+---------+---------------------+---------------------+-------+-----------+---------+
| id | uid  | exam_id | start_time          | submit_time         | score | long_time | row_num |
+----+------+---------+---------------------+---------------------+-------+-----------+---------+
|  8 | 1006 |    9001 | 2021-09-07 10:01:01 | 2021-09-07 10:12:01 |    84 |       660 |       2 |
|  2 | 1001 |    9002 | 2021-09-01 09:01:01 | 2021-09-01 09:31:00 |    81 |      1799 |       2 |
+----+------+---------+---------------------+---------------------+-------+-----------+---------+
2 rows in set (0.00 sec)

mysql> 
mysql>     select * from (
    ->         select * ,
    ->         row_number() over(partition by exam_id order by long_time desc) as row_num
    ->         from (
    ->         select * , 
    ->         TIMESTAMPDIFF(second,start_time,submit_time) as long_time
    ->         from exam_record where submit_time is not null 
    ->         )t1
    ->     )t2 where row_num = 2  ;
+----+------+---------+---------------------+---------------------+-------+-----------+---------+
| id | uid  | exam_id | start_time          | submit_time         | score | long_time | row_num |
+----+------+---------+---------------------+---------------------+-------+-----------+---------+
|  1 | 1001 |    9001 | 2021-09-01 09:01:01 | 2021-09-01 09:51:01 |    78 |      3000 |       2 |
|  3 | 1002 |    9002 | 2021-09-01 12:01:01 | 2021-09-01 12:31:01 |    81 |      1800 |       2 |
+----+------+---------+---------------------+---------------------+-------+-----------+---------+
2 rows in set (0.00 sec)
不足之处,欢迎指正








全部评论
with t1 as(select exam_id, timestampdiff(second, start_time, submit_time) df1, row_number() over(partition by exam_id order by timestampdiff(second, start_time, submit_time) desc) rk1 from exam_record where submit_time is not null), t2 as(select exam_id, timestampdiff(second, start_time, submit_time) df2, 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) select exam_id, duration, release_time from t1 join t2 using(exam_id) join examination_info using(exam_id) where rk1 = 2 and rk2 = 2 and (df1-df2)*2>=duration*60 order by 1 desc;
3 回复 分享
发布于 2022-05-01 12:25
第二快和第二慢是不是可以同时获取?,窗口函数中改变一下排序方向,都取排名等于2的那一个
1 回复 分享
发布于 2021-12-17 16:26
看了一圈,感觉都没我的简单。我怀疑是不是我这样做有问题,谁知道呀?望指点。t1表是 花费时间倒序,t2表是 花费时间正序。然后三表连接where条件之后就出结果了呀。为什么还要再子查询一次?
点赞 回复 分享
发布于 2022-05-01 12:32

相关推荐

ResourceUtilization:四六级不愧是大学最有用的证之一
点赞 评论 收藏
分享
ming_ri:“很抱歉,您的简历和我们当前的职位需求不是很匹配”
点赞 评论 收藏
分享
评论
27
3
分享

创作者周榜

更多
牛客网
牛客企业服务