该题重点在“SQL试卷上未完成率较高的50%的用户”,将此要求作为用户的子查询,对于此句的理解,举个例子:假设作答过试卷的总用户数为60,其中作答过sql试卷的有50人,取总人数的一半即为30人(若为小数则向上加一位),按sql试卷未完成率对用户进行降序排序,排名小于等于30的即为未完成率较高的人。

SELECT uid,
       DATE_FORMAT(start_time, '%Y%m') AS start_month,
       COUNT(start_time) AS total_cnt,
       COUNT(score) AS complete_cnt
FROM (
    SELECT uid, start_time, score,
           DENSE_RANK()OVER(PARTITION BY uid ORDER BY DATE_FORMAT(start_time, '%Y%m') DESC) AS recent_months
    FROM exam_record
) months_table
WHERE recent_months <= 3 
    AND uid IN (
        SELECT incomplete_table.uid
        FROM (
            SELECT uid,
            ROW_NUMBER()OVER(ORDER BY incomplete_rate DESC, uid DESC) AS incomplete_rank
            FROM (
                SELECT uid,
                    SUM(IF(score IS NULL, 1, 0)) / COUNT(start_time) AS incomplete_rate
                FROM exam_record JOIN examination_info USING(exam_id)
                WHERE tag = 'SQL'
                GROUP BY uid
            )incomplete_rate_table 
        )incomplete_table JOIN (
            SELECT COUNT(DISTINCT uid) AS user_total
            FROM exam_record
        )user_total_table
        JOIN user_info USING(uid)
        WHERE level BETWEEN 6 AND 7
            AND incomplete_rank <= ceiling(user_total / 2)
    )
GROUP BY uid, start_month
ORDER BY uid ASC, start_month ASC