题解 | #平均活跃天数和月活人数#
平均活跃天数和月活人数
https://www.nowcoder.com/practice/9e2fb674b58b4f60ac765b7a37dde1b9
select date_format(submit_time,"%Y%m") as month, round(count(distinct uid,date_format(submit_time,"%Y%m%d"))/count(distinct uid),2) as avg_active_days, count(distinct uid) as mau from exam_record where submit_time is not null and year(submit_time) = 2021 group by month
1.平均活跃天数= 总活跃天数 / 月活人数。关键的是求解总活跃天数,总活跃天数是每天活跃用户数之和。
2.如果一个人一天活跃多次(也就是提交多次试卷),那么在总活跃天数里只能算一天,所以对用户uid和和提交时间submit_time作为组合同时去重。这里不能用uid和start_time是因为有些用户有start_time,但是没有交卷,submit_time是为null的,这样不能算是活跃。
注意,一天有n个用户活跃,那么总活跃天数是算n的。
3.为什么在对uid和submit_time去重时要使用date_format()格式化日期?这是因为submit_time本身是精确到几点几分几秒的,如果是COUNT(DISTINCT uid, submit_time)会导致假如同一用户在同一天两次不同时间提交,那么会被算作2,只有把submit_time提取成年月日,才能去重为1。
4.DATE_FORMAT(datetime, '%Y%m%d')注意m和d要小写。也可以换成其他形式,例如DATE_FORMAT(datetime, '%Y-%m-%d')