持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
leetcode刷题1141-查询近30天活跃用户数
前文
本文内容为leetcode数据库类型题目,主要考查对于查询相关知识的掌握。本文解题方案为个人理解,并非最佳解决方案。该题目序号为1141,题目链接为leetcode.cn/problems/us…
题目信息
活动记录表: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 天的每日活跃用户数(当天只要有一条活动记录,即为活跃用户)。
题目分析
首先分析一下题目,题目给了我们一张活动表,表中包含了玩家id、活跃日期以及两个与本题目关联不大的字段活跃类型和session信息。根据题目的要求,我们需要得到最近30天的活跃用户,很容易会想到采用group by进行分组实现。我们采用日期分组,对于用户id的数量进行聚合求总数。但有一点是需要注意的,该表中每个用户是可以在每天出现多条活跃记录的,因此我们需要对于用户id再进行一轮去重复处理。到这里,我们已经可以得到每天实际的活跃用户数量。由于我们需要限定时间范围,因此分组的数据源我们需要进行时间范围的指定,时间范围是6月27日到7月27日,我们只需要查询到该时间段内的活跃记录即可。要注意的是,当我们将分组group by与where同时使用时,需要首先利用where对数据进行初步的筛选,错误的顺序会导致语法报错。至此,本题目解题完毕。
解题答案
select activity_date as day,count(distinct user_id) as active_users
from activity
where activity_date <= '2019-07-27' and activity_date > '2019-06-27'
group by activity_date
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。