要求

请计算2021年每个月里试卷作答区用户平均月活跃天数avg_active_days和月度活跃人数mau

思路

  1. 2021年: YEAR(submit_time) = 2021
  2. 每个月: group by month -- extract(YEAR_MONTH from submit_time) as month -- YEAR_MONTH 能直接取出年月
  3. 用户平均月活跃天数: round(count(distinct concat(uid,date(submit_time))) / count(distinct uid),2)

相同用户同一天多次答题只算一天所以这里要用distinct去除同一uid一天内多次答题。 并且,两个不同用户同一天答题算两天,所以为了识别是同一用户一天内多次答题还是不同用户同一天答题,我们用 concat(uid,date(submit_time) 将 uid 和 日期剪贴到一起,这样就能用count 正确的计算了。下面是concat(uid,date(submit_time) 的输出结果 (如果想好看点,中间可以加个空格分隔开)

alt

PS:这里只要date,不要把time一起加上去,因为同一天不同时间提交会导致重复计算。

  1. mau: count(distinct uid)

实现

select extract(YEAR_MONTH from submit_time) as month,
round(count(distinct concat(uid,date(submit_time))) / count(distinct uid),2)  as avg_active_days,
count(distinct uid) as mau
from exam_record
where year(submit_time) = 2021 and submit_time is not null
group by month