/*关键点:窗口函数执行在select语句后面;select后面的窗口函数可以放在if()里面从而嵌一层判断(当然也可以靠子查询实现);sum()和max()作为窗口函数时,使用order by指定排序列,可实现起始-当前行的求和或取大(默认升序)*/
# 查询开始月份、uid、和新增用户判断列
select date_format(start_time, '%Y%m') start_month, uid,
if(start_time=min(start_time)over(partition by uid), 1, 0) new_tag
from exam_record

# 查询自从有用户作答记录以来,每月的试卷作答记录中月活用户数、新增用户数、截止当月的单月最大新增用户数、截止当月的累积用户数。结果按月份升序输出
# 截止当月的单月最大新增用户数、截止当月的累积用户数两个字段要基于“每月的试卷作答记录中月活用户数、新增用户数”这两个字段的查询结果,在select查询结果列(但不能使用别名)基础上使用窗口函数生成新列
select start_month, count(distinct uid) mau, sum(new_tag) month_add_uv, max(sum(new_tag))over(order by start_month) as max_month_add_uv, sum(sum(new_tag))over(order by start_month) as cum_sum_uv
from (
    select date_format(start_time, '%Y%m') start_month, uid,
    if(start_time=min(start_time)over(partition by uid), 1, 0) new_tag
    from exam_record
) k1
group by start_month
order by start_month;