【LeetCode-SQL】1141. 查询近30天活跃用户数

目录

  • 一、题目
  • 二、解决
    • 1、datediff + group + distinct
  • 三、参考

一、题目

活动记录表:Activity

+---------------+---------+
| 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:

输入:
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   |
+---------+------------+---------------+---------------+
输出:
+------------+--------------+ 
| day        | active_users |
+------------+--------------+ 
| 2019-07-20 | 2            |
| 2019-07-21 | 2            |
+------------+--------------+ 
解释:注意非活跃用户的记录不需要展示。

二、解决

1、datediff + group + distinct

思路:

2019-07-2730天,包含2019-07-27# 方法1:date_add()
where activity_date between date_add('2019-07-27', interval -29 day) and '2019-07-27'
# 方法2:datediff()
where datediff('2019-07-27', activity_date) <= 29 and datediff('2019-07-27', activity_date) >= 0
# 方法3:date_sub()
where activity_date >= date_sub('2019-07-27', interval 29 day) and activity_date <= '2019-07-27'

代码:

select activity_date as day, count(distinct(user_id)) as active_users
from Activity
where datediff('2019-07-27', activity_date) <= 29 and datediff('2019-07-27', activity_date) >= 0
group by activity_date;

三、参考

1、时间限制条件:一个月到底有多少天?
2、distinct+date_add+group 解决问题
3、查询近30天活跃用户数

你可能感兴趣的:(LeetCode-SQL,sql,leetcode,数据库)