题解 | #平均活跃天数和月活人数#
平均活跃天数和月活人数
https://www.nowcoder.com/practice/9e2fb674b58b4f60ac765b7a37dde1b9
select
date_format(start_time,'%Y%m') as month, #date_format() 通过这个函数匹配'%Y%m'年份和月份;
round(count(distinct uid,date_format(start_time,'%Y%m%d'))/count(distinct uid),2) as avg_active_days,
#假设一个uid 比如1001在2021-07-06这一天有二个记录,如果是count(start_time)那么就是天数是2;
#但是如果是count(distinct uid,date_format(start_time,"%Y%m%d"))天数就是1了,因为只有 2021-07-06只有一天存在
count(distinct uid) as mau
from
exam_record
where
year(submit_time) = 2021
group by month
这题比较坑:
(1)用户活跃天数:同一个用户一天提交两次算是活跃1天,但是两个用户同天分别提交一次算是活跃两天,因此
count(distinct uid,date_format(start_time,'%Y%m%d')算的是当天活跃的用户量,有了distinct uid的限制,count函数不会将同一用户一天提交两次算作活跃两天;
(2)group by:搜了一下,MySQL支持group by 后跟别名。
但是注意,SQL按照如下顺序执行查询:
FROM子句
WHERE子句
GROUP BY子句
HAVING子句
SELECT子句
ORDER BY子句
对于大多数关系数据库系统来说,这个顺序解释了哪些名称(列或别名)是有效的,因为它们必须在前面的步骤中引入。
因此,在Oracle和SQL Server中,不能在SELECT子句中定义的GROUP BY子句中使用一个术语,因为GROUP BY是在SELECT子句之前执行的。