文章目录
- 1. 题目
- 2. 解题
1. 题目
表 Accounts:
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| name | varchar |
+---------------+---------+
id 是该表主键.
该表包含账户 id 和账户的用户名.
表 Logins:
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| login_date | date |
+---------------+---------+
该表无主键, 可能包含重复项.
该表包含登录用户的账户 id 和登录日期.
用户也许一天内登录多次.
写一个 SQL 查询, 找到活跃用户的 id 和 name.
活跃用户是指那些至少连续 5 天登录账户的用户.
返回的结果表按照 id 排序.
结果表格式如下例所示:
Accounts 表:
+----+----------+
| id | name |
+----+----------+
| 1 | Winston |
| 7 | Jonathan |
+----+----------+Logins 表:
+----+------------+
| id | login_date |
+----+------------+
| 7 | 2020-05-30 |
| 1 | 2020-05-30 |
| 7 | 2020-05-31 |
| 7 | 2020-06-01 |
| 7 | 2020-06-02 |
| 7 | 2020-06-02 |
| 7 | 2020-06-03 |
| 1 | 2020-06-07 |
| 7 | 2020-06-10 |
+----+------------+Result 表:
+----+----------+
| id | name |
+----+----------+
| 7 | Jonathan |
+----+----------+
id = 1 的用户 Winston 仅仅在不同的 2 天内登录了 2 次,
所以, Winston 不是活跃用户.id = 7 的用户 Jonathon 在不同的 6 天内登录了 7 次,
6 天中有 5 天是连续的, 所以, Jonathan 是活跃用户.
后续问题:
如果活跃用户是那些至少连续 n 天登录账户的用户, 你能否写出通用的解决方案?
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/active-users
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
参考阅读 MYSQL实现排名函数RANK,DENSE_RANK和ROW_NUMBER
select id, login_date, dense_rank() over(partition by id order by login_date) rnk from Logins
{"headers": ["id", "login_date", "rnk"],
"values": [
[1, "2020-05-30", 1],
[1, "2020-06-07", 2],
[7, "2020-05-30", 1],
[7, "2020-05-31", 2],
[7, "2020-06-01", 3],
[7, "2020-06-02", 4],
[7, "2020-06-02", 4],
[7, "2020-06-03", 5],
[7, "2020-06-10", 6]]}
group by id, date_sub(login_date, interval rnk day)
,连续登录日期减去rank就都一样了,统计记录条数是否大于5
# Write your MySQL query statement below
with table1 as
(select id, login_date, dense_rank() over(partition by id order by login_date) rnkfrom Logins
) # 建立表名select distinct table1.id, name
from table1 left join Accounts a
on table1.id = a.id
group by id, date_sub(login_date, interval rnk day)
having count(distinct login_date) >= 5
order by id
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!