用窗口函数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