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

【场景】:截止某个时间段的统计结果、每月新增用户数

【分类】:聚合窗口函数

分析思路

难点:

1.如何求每月新增用户

2.截至当月的答题情况

(1)统计每个人的首次登陆月份

  • [使用]:min()

(2)统计每月的月活和新增用户数

先得到每个人的首次登陆月份,再对首次登陆月份分组求和是该月份的新增人数, 例如:

​ 1月有用户1002;2月有用户1002、1003、1004;新增用户数为2;

​ 1月有用户1001;2月由用户1002、1003、1004;新增用户数为3。

求每月的月活根据exam_record表中的用户;求每月的新增用户根据上面的表中的用户

  • [使用]:group by start_month;count(distinct a.uid)

(3)统计截止当月的单月最大新增用户数、截止当月的累积用户数 ,最终按照按月份升序输出

  • [使用]:窗口函数 max(新增) over(order by 月份)
  • [使用]:窗口函数 sum(新增) over(order by 月份)

求解代码

方法一

with子句

with 
    main as(
        #统计每个人的首次登陆月份
        select 
            uid,
            min(date_format(start_time,'%Y%m'))as first_month 
        from  exam_record
        group by uid
    )
    ,main1 as(
        #统计每月的月活和新增用户数
        select 
            date_format(a.start_time,'%Y%m') as start_month,
            count(distinct a.uid) as mau,
            count(distinct b.uid) as month_add_uv
        from exam_record a
        left join main b on date_format(a.start_time,'%Y%m') = b.first_month
        group by start_month
    )

#截止当月的单月最大新增用户数、截止当月的累积用户数,按月份升序输出
select
    start_month,
    mau,
    month_add_uv,
    max(month_add_uv) over(order by start_month),
    sum(month_add_uv) over(order by start_month)
from main1
order by start_month

main 表输出结果

1	1001|202001	
2	1002|202001	
3	1003|202002	
4	1004|202002	

main1 表输出结果

1	202001|2|2
2	202002|4|2
3	202003|3|0
4	202005|1|0	

方法二

from嵌套子查询

#截止当月的单月最大新增用户数、截止当月的累积用户数,按月份升序输出
select
    start_month,
    mau,
    month_add_uv,
    max(month_add_uv) over(order by start_month),
    sum(month_add_uv) over(order by start_month)
from(
    #统计每月的月活和新增用户数
    select 
        date_format(a.start_time,'%Y%m') as start_month,
        count(distinct a.uid) as mau,
        count(distinct b.uid) as month_add_uv
    from exam_record a
    left join(
        #统计每个人的首次登陆月份
        select 
            uid,
            min(date_format(start_time,'%Y%m'))as first_month 
        from  exam_record
        group by uid
    ) b on date_format(a.start_time,'%Y%m') = b.first_month
    group by start_month
) main
order by start_month
全部评论

相关推荐

10-11 17:30
湖南大学 C++
我已成为0offer的糕手:羡慕
点赞 评论 收藏
分享
头像
昨天 14:28
长沙理工大学
刷算法真的是提升代码能力最快的方法吗? 刷算法真的是提升代码能力最快的方法吗?
牛牛不会牛泪:看你想提升什么,代码能力太宽泛了,是想提升算法能力还是工程能力? 工程能力做项目找实习,算法也分数据结构算法题和深度学习之类算法
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务