LeetCode:Database 100.活跃用户
Posted Xiao Miao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode:Database 100.活跃用户相关的知识,希望对你有一定的参考价值。
要求:写一个 SQL 查询, 找到活跃用户的 id 和 name。
活跃用户是指那些至少连续 5 天登录账户的用户,返回的结果表按照 id 排序。
表 Accounts的结构:
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| name | varchar |
+---------------+---------+
id 是该表主键.
该表包含账户 id 和账户的用户名.
表 Logins的结构:
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| login_date | date |
+---------------+---------+
该表无主键, 可能包含重复项.
该表包含登录用户的账户 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 Table:
+----+----------+
| id | name |
+----+----------+
| 7 | Jonathan |
+----+----------+
id = 1 的用户 Winston 仅仅在不同的 2 天内登录了 2 次, 所以, Winston 不是活跃用户.
id = 7 的用户 Jonathon 在不同的 6 天内登录了 7 次, , 6 天中有 5 天是连续的, 所以, Jonathan 是活跃用户.
SQL语句:
with a as(select id,login_date
from logins group by id,login_date
order by login_date asc),b as(select id,login_date,row_number() over(partition by id order by login_date asc)as r1 from a),c as(select id,adddate(login_date,-r1) as a1
from b)
select distinct c.id,d.name
from c
join accounts d
on d.id=c.id
group by c.id,c.a1
having count(c.id)>=5
order by c.id asc;
以上是关于LeetCode:Database 100.活跃用户的主要内容,如果未能解决你的问题,请参考以下文章