select exam_id,duration,release_time from (
select
exam_id,sum(case when rank_asc = 2 then time_1 else 0 end) as asc_d
,sum(case when rank_desc = 2 then time_1 else 0 end) as desc_d
from (
select exam_id,timestampdiff(second,start_time,submit_time) as time_1,
row_number() over(partition by exam_id order by timestampdiff(second,start_time,submit_time)) as rank_asc,
row_number() over(partition by exam_id order by timestampdiff(second,start_time,submit_time) desc) as rank_desc
from exam_record t
where submit_time is not null ) t1
group by exam_id)t2
join examination_info t3 using(exam_id)
where (desc_d-asc_d)>(duration*30)
order by exam_id desc
这个思路就是先使用窗口函数算出排名,然后取出第二和倒数第二的值,然后计算即可。
这个方法就是对写作格式要求比较高,容易在小地方写错,导致报错,需要细心一点。
同时学到了新的窗口函数
select distinct exam_id,duration,release_time from(
select exam_id,duration,release_time,
nth_value(TIMESTAMPDIFF(second,start_time,submit_time),2)
over(partition by exam_id order by TIMESTAMPDIFF(minute,start_time,submit_time) desc ) as desc_d,
nth_value(TIMESTAMPDIFF(second,start_time,submit_time),2)
over(partition by exam_id order by TIMESTAMPDIFF(minute,start_time,submit_time) ) as asc_d
from exam_record t join examination_info t1 using(exam_id))t2
where desc_d-asc_d>(duration*30)
order by exam_id desc
https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html

京公网安备 11010502036488号