题解 | #每月及截止当月的答题情况#
每月及截止当月的答题情况
https://www.nowcoder.com/practice/1ce93d5cec5c4243930fc5e8efaaca1e
# 统计出每月新增的月活跃用户才是关键的核心所在。
# 世上无难事,只怕有心人 不关心用户ID,不关心试卷ID,只关心 每月的作答纪录情况
/*
# 统计每月的 月活用户数,新增用户数,截止当月的单月最大新增用户数。
select C.start_month ,
C.mau ,
(case when C.lastMau is null then
C.mau
when C.lastMau is not null and C.mau>=C.lastMau then
(C.mau-C.lastMau)
else 0 end
) month_add_uv,
max(C.mau-if(C.lastMau is null,0,C.lastMau)) over(order by start_month) max_month_add_uv ,
sum((case when C.lastMau is null then
C.mau
when C.lastMau is not null and C.mau>=C.lastMau then
(C.mau-C.lastMau)
else 0 end
)) over(order by start_month) cum_sum_uv
from (
# 统计 每月份的月活用户数,上月月活用户数
select B.start_month,
count(B.uid) mau ,
lag(count(B.uid),1) over(order by B.start_month) lastMau # 上月的用户数。
from (
# 统计基表的基础数据
select A.start_month,A.uid from (
select date_format(ER.start_time,'%Y%m') start_month ,
ER.exam_id,
ER.uid
from exam_record ER
) A
group by A.start_month,A.uid
) B
group by B.start_month
) C
order by C.start_month ;
*/
# 统计每个月的新用户
select ER.start_month, # 每月的月份数
count(distinct ER.uid) , # 月活用户数
sum(ER.new_day) month_add_uv, # 新增用户数
max(sum(ER.new_day)) over(order by ER.start_month) max_month_add_uv, # 截止当月的最大单月新增用户数
sum(sum(ER.new_day)) over(order by ER.start_month) cum_sum_uv # 截止当月的累计单月新增用户数
from (
select *,
date_format(start_time,'%Y%m') start_month,
if(start_time = min(start_time) over(partition by uid),1,0) new_day
from exam_record
) ER group by ER.start_month order by ER.start_month ;

查看6道真题和解析