MySQL之查询近30天活跃用户数

近 30天的每日活跃用户数(当天只要有一条活动记录,即为活跃用户)。

Activity table:
+---------+------------+---------------+---------------+
| user_id | session_id | activity_date | activity_type |
+---------+------------+---------------+---------------+
| 1       | 1          | 2019-07-20    | open_session  |
| 1       | 1          | 2019-07-20    | scroll_down   |
| 1       | 1          | 2019-07-20    | end_session   |
| 2       | 4          | 2019-07-20    | open_session  |
| 2       | 4          | 2019-07-21    | send_message  |
| 2       | 4          | 2019-07-21    | end_session   |
| 3       | 2          | 2019-07-21    | open_session  |
| 3       | 2          | 2019-07-21    | send_message  |
| 3       | 2          | 2019-07-21    | end_session   |
| 4       | 3          | 2019-06-25    | open_session  |
| 4       | 3          | 2019-06-25    | end_session   |
+---------+------------+---------------+---------------+

Result table:
+------------+--------------+ 
| day        | active_users |
+------------+--------------+ 
| 2019-07-20 | 2            |
| 2019-07-21 | 2            |
+------------+--------------+ 
非活跃用户的记录不需要展示。

解题

  • 一个用户可能有多个 session_id,不能用它去重
  • datediff('2019-07-27', activity_date),前者减后者的值

方式一

# Write your MySQL query statement below
select activity_date day, count(distinct user_id) active_users
from Activity
where datediff('2019-07-27', activity_date) < 30
group by activity_date
  • 因为题目说 30 天内并且包含本日(2019-07-27),所以是小于等于 29 天,如果等于 30 的话,说明 31 天内了。

方式二

  • date_sub('2019-07-27', interval 30 day)前者减去30天
# Write your MySQL query statement below
select activity_date day, count(distinct user_id) active_users
from Activity
where activity_date > date_sub('2019-07-27', interval 30 day)
group by activity_date
posted @ 2025-04-08 23:50  程序员の奇妙冒险  阅读(41)  评论(0)    收藏  举报