select 
    y_month as start_month,mau,month_add_uv,
    max(month_add_uv) over(order by y_month) as max_month_add_uv, 
    sum(month_add_uv) over(order by y_month) as max_month_add_uv 
from(
    select y_month,
    count(uid) as mau,
    sum(case when ranking = 1 then 1 else 0 end) as month_add_uv
    from (
        select date_format(start_time,'%Y%m') as y_month,uid,
        row_number() over(partition by uid order by date_format(start_time,'%Y%m')) as ranking
        from exam_record
        group by date_format(start_time,'%Y%m'),uid)t
        group by y_month
        order by y_month)t1

首先按用户活跃的情况整理一张活跃表,再标识出用户在每个月出现的位置

然后根据这个可以算出月活及每月新增

然后根据这个算出 累计到每月的情况。

    -- 优化版本
    select y_month,
    count(uid) as mau,
    sum(case when ranking = 1 then 1 else 0 end) as month_add_uv,
    max(sum(case when ranking = 1 then 1 else 0 end)) over(order by y_month) as max_month_add_uv, 
    sum(sum(case when ranking = 1 then 1 else 0 end)) over(order by y_month) as cum_sum_uv 
    from (
        select date_format(start_time,'%Y%m') as y_month,uid,
        row_number() over(partition by uid order by date_format(start_time,'%Y%m')) as ranking
        from exam_record
        group by date_format(start_time,'%Y%m'),uid)t
        group by y_month
        order by y_month