用窗口函数NTH_VALUE(),可以直接从有序集中获取想要的行数。
SELECT DISTINCT exam_id, duration, release_time FROM ( SELECT exam_id, duration, release_time, NTH_VALUE(TIMESTAMPDIFF(MINUTE, start_time, submit_time), 2) OVER (PARTITION BY exam_id ORDER BY TIMESTAMPDIFF(MINUTE, start_time, submit_time) DESC) AS fast_2, NTH_VALUE(TIMESTAMPDIFF(MINUTE, start_time, submit_time), 2) OVER (PARTITION BY exam_id ORDER BY TIMESTAMPDIFF(MINUTE, start_time, submit_time) ASC) AS low_2 FROM exam_record JOIN examination_info USING(exam_id) WHERE submit_time IS NOT NULL ) t1 WHERE fast_2 IS NOT NULL AND low_2 IS NOT NULL AND fast_2 - low_2 >= duration / 2 ORDER BY exam_id DESC