题解 | #每月及截止当月的答题情况#

每月及截止当月的答题情况

https://www.nowcoder.com/practice/1ce93d5cec5c4243930fc5e8efaaca1e

思路:
1.先计算每位用户的最先登录时间,判断是否为新增,打标;
2.对新增的用户进行统计
具体步骤:

  • 对新增用户打标,建立子表。
    • 当登录时间与用户的最小登录时间一致时,则打标:if(start_time = min(start_time) over(partition by uid),1,0) as tag
  • 从子表统计月活用户数、新增用户数、截止当月的单月最大新增用户数、截止当月的累积用户数。
    • 分组:group by month
    • 月活:count(distinct uid)
    • 新增用户数:sum(tag)
    • 截止当月的单月最大新增用户数:max(新增用户数) over(order by month)
    • 截止当月的累积用户数,按照月份依次累加:sum() over(order by month)
    • 排序:order by

代码:

select
    date_format(start_time,"%Y%m") as start_month,
    count(distinct uid),
    sum(tag) as month_add_uv,
    max(sum(tag)) over(order by date_format(start_time,"%Y%m")) as max_month_add_uv,
    sum(sum(tag)) over(order by date_format(start_time,"%Y%m")) as cum_sum_uv
from(
    select
        *,
        if(start_time = min(start_time) over(partition by uid),1,0) as tag
    from exam_record
) add_uv
group by date_format(start_time,"%Y%m")
order by start_month

总结
注意min()over(),max()over(),sum()over()的应用,特别是其中的partition by,order by 的取值

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务