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则不一样,不能结合使用。