题目:查询近30天活跃用户数
+---------------+---------+ |
Column Name | Type
| +---------------+---------+ |
user_id | int |
| session_id | int |
| activity_date | date |
| activity_type | enum |
+---------------+---------+
该表没有主键,可能包含重复数据。 activity_type 字段为以下四种值 ('open_session', 'end_session', 'scroll_down', 'send_message')。 每个 session_id 只属于一个用户。
要求:
请写SQL查询出截至 2019-07-27(包含2019-07-27),近 30 天的每日活跃用户数(当天只要有一条活动记录,即为活跃用户)。
以 任意顺序 返回结果表。
查询结果示例如下。
案例:
思路1:
使用到的方法
-
datediff 日期计算函数,可以计算两日期之间的差值,也可以和where 条件判断结合,取日期范围
-
group by 分组函数
-
count 统计函数
-
distinct 去重
-
通过datediff 将截至 2019-07-27(包含2019-07-27)近30天的日期进行切割取出日期的范围
where datediff (' 2019-07-27',activity_date )<30
and activity_date =' 2019-07-27'
- 将所取日期进行分组
where datediff (' 2019-07-27',activity_date )<30
and activity_date =' 2019-07-27' group by activity_date
- 最后进行统计,需要对user_id进行去重操作
select
activity_date `day` , count(distinct session_id ) active_users
from Activity where dateDiff('2019-07-27',activity_date)<30 and
activity_date<='2019-07-27' group by activity_date
误区:
为什么只能用user_id, 不能用session_id :
原因:因为session_id只属于一个用户,而一个用户一天可能对应多个session_id ; 所以,如果用了session_id将会在第四个案例出错,会发现有些数据比标准输出大就是这个原因
统计session_id出现的次数,将会报错
思路2:
日期减法取范围,使用到的核心函数为date_sub
做日期减法的时候,和HIVE中的区别是,mysql中需要添加 interval 29 day。
按筛选符合条件的日期,然后按照日期分组最后组内计数即可。
SELECT
activity_date day,
COUNT(DISTINCT user_id) active_users
FROM Activity
WHERE activity_date>=date_sub('2019-07-27', interval 29 day)
AND activity_date<='2019-07-27'
GROUP BY activity_date