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