Mysql如何查询近30天活跃用户数
思路:
题目要求:统计截至 2019-07-27(包含2019-07-27),近 30 天的每日活跃用户数(当天只要有一条活动记录,即为活跃用户)
要计算日期之间的天数,这时就需要用到DATEDIFF函数
DATEDIFF(date1,date2):返回date1 - date2的日期间隔天数
把在时间要求内的筛选出来,再进行 用户id 分组,最后统计用户个数(去重后的)
解题过程:
先对日期进行筛选
SELECT *
FROM activity
WHERE DATEDIFF('2019-07-27',activity_date) BETWEEN 0 AND 29
然后再日期进行分组,计算用户id,这时需要对用户id进行去重,若不去重,则会出现以下结果
SELECT activity_date, COUNT(user_id)
FROM activity
WHERE DATEDIFF('2019-07-27',activity_date) BETWEEN 0 AND 29
GROUP BY activity_date 
所以需要对用户id进行去重处理(COUNT(DISTINCT user_id)保证每个用户不相同(或者说重复出现)
踩了个坑:
WHERE DATEDIFF('2019-07-27',activity_date) BETWEEN 0 AND 29
GROUP BY activity_date和
GROUP BY activity_date
HAVING DATEDIFF('2019-07-27',activity_date) BETWEEN 0 AND 29提出问题,这两个mysql语句都可以执行成功,但两者一点问题都没有嘛?
一个先过滤后分组,另一个先分组后过滤。按理说没毛病啊
但是结果却是:
- 第一个查询是正确的,因为它使用WHERE子句来过滤日期范围,然后使用GROUP BY和COUNT(DISTINCT user_id)来统计每日活跃用户数。
- 第二个查询错误地将日期范围过滤放在了HAVING子句中,而没有使用聚合函数,这不符合SQL语法。
- 正确的做法是在WHERE子句中指定日期范围过滤条件,然后使用GROUP BY进行分组统计。
注意:HAVING子句不能独立于聚合函数使用来过滤原始数据
更多关于聚合函数的要点可以查看MySQL零散拾遗(四)借这个案例把里面的要点进行更进一步的阐述说明。
Code
踩坑了
SELECT activity_date day, COUNT(DISTINCT user_id) active_users
FROM activity
WHERE DATEDIFF('2019-07-27',activity_date) BETWEEN 0 AND 29
GROUP BY activity_date 到此这篇关于Mysql查询近30天活跃用户数的文章就介绍到这了,更多相关Mysql查询活跃用户数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器,这篇文章主要介绍了weblogic服务建立数据源连接测试更新mysql驱动包,需要的朋友可以参考下2022-01-01
MySql InnoDB存储引擎之Buffer Pool运行原理讲解
缓冲池是用于存储InnoDB表,索引和其他辅助缓冲区的缓存数据的内存区域。缓冲池的大小对于系统性能很重要。更大的缓冲池可以减少磁盘I/O来多次访问同一表数据。在专用数据库服务器上,可以将缓冲池大小设置为计算机物理内存大小的百分之802023-01-01
mysql 5.7.15 安装配置方法图文教程(windows)
这篇文章主要为大家详细介绍了mysql 5.7.15 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-07-07


最新评论