【Leetcode】高频SQL基础题–1141.查询近30天活跃用户数
要求:编写解决方案,统计截至 2019-07-27(包含2019-07-27),近 30 天的每日活跃用户数(当天只要有一条活动记录,即为活跃用户)。
以 任意顺序 返回结果表。
解题思路:
1、先用 HWHERE 过滤,只处理2019-06-28至2019-07-27之间的记录;
2、然后按照 activity_date 进行分组;
3、最后使用COUNT(DISTINCT user_id)统计每日唯一用户数。
重点:
1、如何表示时间范围:2019-06-28至2019-07-27
activity_date BETWEEN DATE_SUB('2019-07-27', INTERVAL 29 DAY) AND '2019-07-27'
activity_date BETWEEN DATE_ADD('2019-07-27',INTERVAL -29 day) AND '2019-07-27'
DATEDIFF("2019-07-27",activity_date) BETWEEN 0 AND 29
activity_date BETWEEN '2019-06-28' AND '2019-07-27'
2、日期时间计算:
--日期加法 例如:DATE_ADD('2023-10-15', INTERVAL 1 DAY) → 2023-10-16
DATE_ADD(date, INTERVAL expr unit)
--日期减法 例如:DATE_SUB('2023-10-15', INTERVAL 1 MONTH) → 2023-09-15
DATE_SUB(date, INTERVAL expr unit)
--同 DATE_ADD
ADDDATE(date, INTERVAL expr unit)
--同 DATE_SUB
SUBDATE(date, INTERVAL expr unit)
--日期差(天数) DATEDIFF('2023-10-20', '2023-10-15') → 5
DATEDIFF(date1, date2)
--时间差 TIMEDIFF('14:30:00', '12:00:00') → 02:30:00
TIMEDIFF(time1, time2)
--时间差(指定单位) TIMESTAMPDIFF(MONTH, '2023-01-01', '2023-10-15') → 9
TIMESTAMPDIFF(unit, start, end)
代码:
SELECT
activity_date AS day,
COUNT(DISTINCT user_id) AS active_users
FROM
Activity
WHERE
activity_date BETWEEN DATE_SUB('2019-07-27', INTERVAL 29 DAY) AND '2019-07-27'
GROUP BY activity_date