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.活跃用户的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode:Database 53.查询活跃业务

LeetCode:Database 56.查询近30天活跃用户数

leetcode Database3

LeetCode 1817. 查找用户活跃分钟数

LeetCode 1817. 查找用户活跃分钟数

LeetCode 1817. 查找用户活跃分钟数