/** * 分组: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