题解 | #平均活跃天数和月活人数#
平均活跃天数和月活人数
https://www.nowcoder.com/practice/9e2fb674b58b4f60ac765b7a37dde1b9
select date_format(start_time,'%Y%m') as month, round(count(distinct uid,day(start_time))/count(distinct uid),2) as avg_active_days, count(distinct uid) as mau from exam_record where year(start_time)=2021 and submit_time is not null group by date_format(start_time,'%Y%m') #group by month(start_time)
重点难点:
- count(distinct A,B) 表示为当A和B其中有一个和之前不一样的,就算一条数据,这是为了过滤掉一天有某个用户多次浏览,这样是一个数据.
- group by 后边的字段必须和select中的保持一致,比如第7行.第8行是最开始写的,如果按照该写法,那么先执行group by,下边执行select的第二行的时候,会报错:非聚合列start_time没有在group by 句子中.因为在group by中,已经按照month(start_time)把start_time处理了,那select date_format(start_time,'%Y%m')的时候就不能这样变换格式了,所以会报错.
- 第3行中,count(distinct day(start_time),uid) 也可以成功,这里distinct可能并不是去重,而是去整体的重?只有当A和B都相同时才会去重.