2022年10月更文挑战30-10-leetcode刷题1141-查询近30天活跃用户数

137 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。