SELECT uid, start_month
,COUNT(start_month) AS total_cnt
,COUNT(submit_time) AS complete_cnt
FROM (
SELECT uid, exam_id, level, submit_time
, DATE_FORMAT(start_time, "%Y%m") AS start_month
, DENSE_RANK() OVER(PARTITION BY uid ORDER BY DATE_FORMAT(start_time, "%Y%m") DESC) AS mon_level
FROM user_info
JOIN exam_record USING(uid)
JOIN examination_info USING(exam_id)
WHERE uid in (
SELECT uid
FROM (
SELECT uid, PERCENT_RANK() OVER(ORDER BY COUNT(submit_time) / COUNT(start_time)) AS rate
FROM user_info
JOIN exam_record USING(uid)
JOIN examination_info USING(exam_id)
WHERE tag = "SQL"
GROUP BY uid
) data1
WHERE rate <= 0.5
) AND level IN (6, 7)
) data
WHERE mon_level <= 3
GROUP BY uid,start_month
ORDER BY uid, start_month