力扣白嫖日记(sql)

前言

练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。

今日题目:

1141.查询近30天活跃用户数
表:Activity

列名 类型
user_id int
session_id int
activity_date date
activity_type enum

该表没有包含重复数据。
activity_type 列是 ENUM(category) 类型, 从 (‘open_session’, ‘end_session’, ‘scroll_down’, ‘send_message’) 取值。该表记录社交媒体网站的用户活动。注意,每个会话只属于一个用户。

编写解决方案,统计截至 2019-07-27(包含2019-07-27),近 30 天的每日活跃用户数(当天只要有一条活动记录,即为活跃用户)。
以 任意顺序 返回结果表。


我那不值一提的想法:

#我的思路:首先梳理表内容,题目只给了一张活跃表,记录了用户id,会话id,活跃日期,活跃类型(“open_session”,“end_session”,“scroll_down”,“send_message”)。其次分析需求,统计截至2019-07-27(包含2019-07-27),近30天的每日活跃用户数(题干要求只要activity_type只要有数据就算活跃用户),我首先想到的就是datediff函数,计算差值要小于等于30天的。然后对日期进行分组,计算count(活跃类型)>=1,得出查询结果。

select activity_date as day , count(distinct user_id) as active_users
from Activity
where datediff("2019-07-27",activity_date) <= 30 
group by activity_date
having count(activity_type) >=1

我首先用以上代码提交,发现结果错误,我看了下查询结果,发现查询结果里没有6月27日,后面我才明白了,因为题干说了包含了7月27日,所以不能等30,应该是29+1 = 30,所以不能加等号,于是我去掉了等号:

select activity_date as day , count(distinct user_id) as active_users
from Activity
where datediff("2019-07-27",activity_date) < 30 
group by activity_date
having count(activity_type) >=1

好好好,发现结果又错了,我查询了结果,发现了直接查询到了8月份的数据了,我才反应过来,原来负数也算小于30的,但题干说明是7月27日截止,所以我们还需要加个条件就是datediff>=0

select activity_date as day , count(distinct user_id) as active_users
from Activity
where datediff("2019-07-27",activity_date) < 30 and datediff("2019-07-27",activity_date) >= 0
group by activity_date
having count(activity_type) >=1

结果:

力扣白嫖日记(sql)_第1张图片


总结:

能运行就行。


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