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

平均活跃天数和月活人数

http://www.nowcoder.com/practice/9e2fb674b58b4f60ac765b7a37dde1b9

SQL17 平均活跃天数和月活人数

题目主要信息:

  • 计算2021年每个月里试卷作答区用户平均月活跃天数avg_active_days和月度活跃人数mau
  • 结果保留两位小数

问题拆分:

  • 根据提交时间submit_time不为空筛选活跃的的人。知识点:select...from...where...
  • 筛选每个月的平均活跃天数和总活跃人数:
    • 根据月份来选择时间。知识点:date_format() 通过这个函数匹配'%Y%m'年份和月份;
    • 计算用户平均活跃天数:
      • 根据不同的日期不同的用户ID统计每个月用户的总活跃天数。知识点:distinct、count()、date_format()
      • 统计每个月用的总人数。知识点:distinct、count()
      • 总天数/总人数得到每个月的用户平均活跃天数;
    • 计算每月总活跃人数,直接统计每月不同的用户id数。知识点:count()、distinct
  • 按照月份分组group by date_format(submit_time, '%Y%m') 知识点:group by ...
  • 保留两位小数。 知识点:round(x,2)

代码:

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 date_format(submit_time, '%Y%m')
孤帆远影碧空尽 文章被收录于专栏

牛客网各类题单题解~

全部评论
关于count(distinct uid, date_format(submit_time, '%y%m%d')),这里distinct表示的是后两个的不同组合。因为是要用每个用户的活跃天数除以总的人数。这里假设1003和1001用户在第一天活跃,1001在第二天活跃。那么就会有 1003,1 1001,1 1001,2 三种结果,这三个结果都要查阅出来。也可以使用count(distinct uid,day(submit_time))等,只要能分辨就可以。
22 回复 分享
发布于 2022-04-20 10:09
写了一些我遇到的问题跟理解,欢迎指正 疑问①:为什么要对两个字段进行去重(为啥要加uid) count(distinct submit_time) vs count(distinct uid,date_format(submit_time,'%Y%m%d') 思路:如果不加uid,那用户1、用户2,两人在同一天做了卷子,这样submi_time只会被记录一次(因为用户1、2的日期一样),加了uid,是为了把不同的用户跟他的做题日期对应起来 疑问②:count后面为什么可以接2个字段 语法:count后面接2个字段,只要2个字段的结果一样,那就判断为重复记录,最后只输出一个结果,所以这里语法是可行的 误区:uid只有一个人,那要是这个人有多个记录,count里面结果不就不一样了? 思路:因此这里count后面的date_format,在格式部分具体到了天('%d'),这样一个用户一天如果提交了2次试卷,在distinct 日期的时候,只会被算作1天,也就是说,每个用户,每天只会被记录一次(如果累计活跃了3天,那这个用户总共会有3条活跃记录),所以在count时候,Uid跟submit_time,每一天都是[1,1],因此在语法上没问题
19 回复 分享
发布于 2022-05-09 17:39
count(distinct uid, date_format(submit_time, '%y%m%d'),麻烦问一下,这行代码是什么意思
11 回复 分享
发布于 2021-11-14 20:25
count(distinct uid, date_format(submit_time, '%y%m%d')), 同问大佬, 这个是什么意思, 见识到了. count()还能这样用!!!
5 回复 分享
发布于 2021-11-17 18:14
同一个uid在同一天做了两套题,活跃应该算1天,所以 uid+年月日 再去重就可以理解了
4 回复 分享
发布于 2022-09-21 21:41 广东
求大佬帮我看下:select date_format(submit_time,'%Y%m') as month, round(count(distinct uid,date_format(submit_time,'%Y%m%d')) / count(distinct uid),2) avg_active_days, count(distinct uid) mau from exam_record where submit_time is not null and year(submit_time)=2001 group by date_format(submit_time,'%Y%m')。跟正确答案了好几遍,到底哪里错了?
点赞 回复 分享
发布于 2022-08-30 13:32 北京
year(submit_time) = 2021已经排除了null值,为什么还要where submit is not null?
3 回复 分享
发布于 2022-05-17 15:52
我是前面的都和你一样,后面直接group by month也可以通过,但是我觉得很奇怪,不是说select在group by 之后执行吗?为啥group by 可以用select命名的month?有人能解答一下吗
2 回复 分享
发布于 2022-06-03 11:09
条件里的 not null 好像可以去掉
2 回复 分享
发布于 2022-04-04 10:28
为什么 平均月活跃天数avg_active_days 用 count(uid) / count(distinct uid) 不行呢
2 回复 分享
发布于 2022-04-03 20:18
count出来两个数字可能是2,3,因为中间有个逗号,拿哪个除以分子,还是说count(distinct uid,date_format)出来的两个数字肯定一样的?
2 回复 分享
发布于 2022-03-23 10:39
为什么要用submit_time而不是start_time呢?
2 回复 分享
发布于 2022-02-16 11:12
英雄所见略同
1 回复 分享
发布于 2023-06-14 23:45 上海
这个答案我恨不能理解,如果你提前把没有提交的数据给排除了,那你再分组的时候还会一定有7月份和9月份吗,正常不应该是即使你7月份和9月份没人提交,你可以显示为0,你这样不直接相当于天然的损失数据了吗???
1 回复 分享
发布于 2023-01-31 12:17 北京
为什么count(distinct uid, date_format(submit_time, '%y%m%d')不能写成count(date_format(submit_time, '%y%m%d'),distinct uid)
1 回复 分享
发布于 2022-12-06 16:14 北京
9月份的活跃天数不是5天吗,然后活跃人数不是4个人吗,所以平均活跃天使不是1.25吗? 是不是我哪里没理解好,希望得到大佬的回答
1 回复 分享
发布于 2022-10-20 00:47 广东
为什么我复制代码区运行答案错误,我没有改动一点
1 回复 分享
发布于 2022-09-04 16:53 湖南
难搞,感觉比算法还难
点赞 回复 分享
发布于 2024-07-21 19:37 上海
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 date_format(submit_time,'%Y%m') 谁能帮忙看一下啊,跟楼主的代码是一样的,但是第二行一直报错啊,已经检查了好多遍了。 count (distinct uid),2) as avg_active_days, count(distinct uid) as mau 只要把这几个代码复制成楼主的就能成功,真不知道是那儿出错了,感谢帮我看一下,谢谢!
点赞 回复 分享
发布于 2024-03-17 15:45 内蒙古
为什么要加上submit_time is not null?
点赞 回复 分享
发布于 2023-04-21 21:03 广东

相关推荐

想去毕业旅行的斑马在...:学校不是92的话,没有实习经历投不了大厂,去投中小厂,拿点实习经历
点赞 评论 收藏
分享
评论
183
56
分享

创作者周榜

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