题解 | #平均活跃天数和月活人数#

平均活跃天数和月活人数

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子句之前执行的。

全部评论

相关推荐

caicaidog:现实里没实习的还是占多数的
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务