/**
* 分组:group by uid
* 计算近三个有作答试卷的月份
    用dense_rank()窗口函数对start_time进行降序排序
        dense_rank() over (partition by uid order by date_format(start_time, '%Y%m') desc) as recent_month
**/
SELECT DISTINCT uid,
       COUNT(submit_time) AS exam_complete_cnt
FROM (
    SELECT uid, submit_time,
           DENSE_RANK()OVER(PARTITION BY uid ORDER BY DATE_FORMAT(start_time, '%Y%m') DESC) AS recent_months
    FROM exam_record
) t1
WHERE recent_months <= 3
GROUP BY uid
HAVING COUNT(submit_time) = COUNT(uid)
ORDER BY exam_complete_cnt DESC, uid DESC