SELECT exam_id
        ,duration
        ,release_time
FROM (
SELECT exam_id,
        duration,
        release_time,
        SUM(CASE WHEN ranking1 = 2 THEN -time WHEN ranking2 = 2 THEN time END) AS sub_time
FROM (
    SELECT uid
        ,exam_id
        ,duration
        ,release_time
        ,TIMESTAMPDIFF(MINUTE, start_time, submit_time) AS time
        ,RANK() OVER(PARTITION BY exam_id ORDER BY TIMESTAMPDIFF(MINUTE, start_time, submit_time)) AS ranking1
        ,RANK() OVER(PARTITION BY exam_id ORDER BY TIMESTAMPDIFF(MINUTE, start_time, submit_time) DESC) AS ranking2
    FROM exam_record
    JOIN examination_info USING(exam_id)
    WHERE submit_time IS NOT NULL
) AS time_sub_time
GROUP BY exam_id
) AS result
WHERE sub_time >= duration*0.5
ORDER BY exam_id DESC;
  • 注意,这里应该使用ROW_numeber,这是因为它对应sum,即使存在多个相同第二名,或存在多个倒数第二名,也可以满足条件,取第一个就行,用户不影响考试,但是使用RANK则不一样,不能结合使用。