LeetCode MySQL 1454. 活跃用户(连续dense_rank排名函数)
发布日期:2021-07-01 03:30:27 浏览次数:2 分类:技术文章

本文共 2102 字,大约阅读时间需要 7 分钟。

文章目录

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. 解题

参考阅读

  • 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 belowwith table1 as(    select id, login_date,             dense_rank() over(partition by id order by login_date) rnk    from Logins) # 建立表名select distinct table1.id, namefrom table1 left join Accounts a on table1.id = a.idgroup by id, date_sub(login_date, interval rnk day)having count(distinct login_date) >= 5order by id

我的CSDN

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

Michael阿明

转载地址:https://michael.blog.csdn.net/article/details/107670499 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:LeetCode MySQL 1398. 购买了产品A和产品B却没有购买产品C的顾客
下一篇:LeetCode MySQL 1321. 餐馆营业额变化增长(over窗口函数)

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月18日 19时02分42秒