先上完整代码,本人笨比一个,所以写的很麻烦,在这里再理一下思路。

select
     e.exam_id,
     duration,
     release_time
from examination_info e
join (
    select *
    from (select
              exam_record. exam_id,
              timestampdiff(second,start_time,submit_time) uset,
              row_number()  over (
                  partition BY exam_record.exam_id
                  order BY timestampdiff(second,start_time,submit_time)
                  ) u_t
          from exam_record
          where submit_time is not null
        ) u_t_k2
    where u_t = 2
)u_t_k21
on  u_t_k21.exam_id = e.exam_id
join (
    select *
    from (select
              exam_record.exam_id,
              timestampdiff(second,start_time,submit_time) uset,
              row_number()  over (
                  partition BY exam_record.exam_id
                  order BY timestampdiff(second,start_time,submit_time ) desc
                  ) u_t
          from exam_record) u_t_m2
    where u_t = 2
)u_t_m21
on  u_t_k21.exam_id = u_t_m21.exam_id
where u_t_m21.uset - u_t_k21.uset > e.duration * 30
order by 
    e.exam_id desc   

这个题最难的地方在自己要有一个足够清晰的思路,要在哪里写需求的东西,来分解一下这个题吧。

首先是第二快,所以就窗口函数排个序先,

select
    exam_id,
    row_number()  over (
    partition BY exam_id
    order BY (timestampdiff(second,start_time,submit_time))
    ) u_t
from exam_record;

然后发现排名不对劲所以就

timestampdiff(second,start_time,submit_time),

看了一眼,原来null也给排上了!没有时间直接第一,所以就加了一个where


select
          exam_id,
          timestampdiff(second,start_time,submit_time) uset,
          row_number()  over (
              partition BY exam_id
              order BY timestampdiff(second,start_time,submit_time)
              ) u_t
      from exam_record
      where submit_time is not null

看一下,哎好了,所以就准备取出第二就再裹一层加个where u_t = 2

那这不就清晰了?再整一个desc不就是倒数第二


select *
    from (select
              exam_record.exam_id,
              timestampdiff(second,start_time,submit_time) uset,
              row_number()  over (
                  partition BY exam_record.exam_id
                  order BY timestampdiff(second,start_time,submit_time ) desc
                  ) u_t
          from exam_record) u_t_m2
    where u_t = 2

好完事这俩结果表一连,发现最后要的居然在第三张表上,没事join连就完了。

然后时间一半,行,筛,选呗

where u_t_m21.uset - u_t_k21.uset > e.duration * 30

哎好,样例过了能交了?

不行,题没看全呢,我这样一整exam_id顺序还是升序的,只不过样例答案刚好就是第一个且只有一个,过不了实际的题例, 所以这在加一个order by

order by 
    e.exam_id desc 

OK 完事!