前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode MySQL 1454. 活跃用户(连续dense_rank排名函数)

LeetCode MySQL 1454. 活跃用户(连续dense_rank排名函数)

作者头像
Michael阿明
发布2021-02-19 10:33:37
6010
发布2021-02-19 10:33:37
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

表 Accounts:

代码语言:javascript
复制
+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| name          | varchar |
+---------------+---------+
id 是该表主键.
该表包含账户 id 和账户的用户名.

表 Logins:

代码语言:javascript
复制
+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| login_date    | date    |
+---------------+---------+
该表无主键, 可能包含重复项.
该表包含登录用户的账户 id 和登录日期. 
用户也许一天内登录多次.

写一个 SQL 查询, 找到活跃用户的 id 和 name.

活跃用户是指那些至少连续 5 天登录账户的用户.

返回的结果表按照 id 排序.

结果表格式如下例所示:

代码语言:javascript
复制
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
代码语言:javascript
复制
{"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
代码语言:javascript
复制
# Write your MySQL query statement below
with table1 as
(
    select id, login_date, 
            dense_rank() over(partition by id order by login_date) rnk
    from 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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档