力扣sql练习:查询近30天活跃用户数

223 阅读1分钟

题目:查询近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 天的每日活跃用户数(当天只要有一条活动记录,即为活跃用户)。

以 任意顺序 返回结果表。

查询结果示例如下。

案例:

30天活跃人数案例.png

思路1:

使用到的方法

  1. datediff 日期计算函数,可以计算两日期之间的差值,也可以和where 条件判断结合,取日期范围

  2. group by 分组函数

  3. count 统计函数

  4. distinct 去重

  5. 通过datediff 将截至 2019-07-27(包含2019-07-27)近30天的日期进行切割取出日期的范围

where datediff (' 2019-07-27',activity_date )<30 
and activity_date =' 2019-07-27'

  1. 将所取日期进行分组
where datediff (' 2019-07-27',activity_date )<30 
and activity_date =' 2019-07-27' group by  activity_date
  1. 最后进行统计,需要对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出现的次数,将会报错

计算30天活跃人数.png

思路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