SELECT tag, exam_cnt_20, exam_cnt_21,
    CONCAT(ROUND((exam_cnt_21 - exam_cnt_20) / exam_cnt_20 * 100, 1), '%') AS growth_rate,
    exam_cnt_rank_20, exam_cnt_rank_21,
    CAST(exam_cnt_rank_21 AS SIGNED) - CAST(exam_cnt_rank_20 AS SIGNED) AS rank_delta
FROM (
    -- 2020年上半年各类试卷做完次数排名
    SELECT tag, exam_cnt_20,
        RANK()OVER(ORDER BY exam_cnt_20 DESC) AS exam_cnt_rank_20
    FROM (
        -- 计算2020年上半年各类试卷做完次数
        SELECT tag,
            COUNT(exam_id) AS exam_cnt_20
        FROM examination_info 
            JOIN exam_record
            USING(exam_id)
        WHERE submit_time IS NOT NULL
            AND YEAR(submit_time) = '2020'
            AND MONTH(submit_time) <= 6
        GROUP BY tag
    )exam_cnt_20_table
)t1 JOIN (
    -- 2021年上半年各类试卷做完次数排名
    SELECT tag, exam_cnt_21,
    RANK()OVER(ORDER BY exam_cnt_21 DESC) AS exam_cnt_rank_21
    FROM (
        -- 计算2021年上半年各类试卷做完次数
        SELECT tag,
            COUNT(exam_id) AS exam_cnt_21
        FROM examination_info 
            JOIN exam_record
            USING(exam_id)
        WHERE submit_time IS NOT NULL
            AND YEAR(submit_time) = '2021'
            AND MONTH(submit_time) <= 6
        GROUP BY tag
    )exam_cnt_21_table
)t2 USING(tag)
ORDER BY growth_rate DESC, exam_cnt_rank_21 DESC