WITH a AS (
    SELECT
        uid,
        DATE_FORMAT(start_time, '%Y%m' ) AS start_month,
        MIN(DATE_FORMAT(start_time, '%Y%m')) OVER (PARTITION BY uid) AS first_month
    FROM
        exam_record
),

b AS (
    SELECT
        start_month,
        COUNT(DISTINCT uid) AS mau
    FROM
        a
    GROUP BY
        start_month
),

c AS (
    SELECT
        start_month,
        COUNT(DISTINCT uid) AS month_add_uv
    FROM
        a
    WHERE
        start_month = first_month 
    GROUP BY
        start_month
),

d AS (
    SELECT
        start_month,
        mau,
        IFNULL(month_add_uv, 0) AS month_add_uv,
        MAX(IFNULL(month_add_uv, 0)) OVER (ORDER BY start_month) AS max_month_add_uv,
        SUM(IFNULL(month_add_uv, 0)) OVER (ORDER BY start_month) AS cum_sum_uv
    FROM
        b
    LEFT JOIN
        c USING(start_month)
)

SELECT
    *
FROM
    d
ORDER BY
    start_month