SQL练习题:连续登录5天的活跃用户
题目
写一个 SQL 查询, 找到活跃用户的 id 和 name.
活跃用户是指那些至少连续 5 天登录账户的用户.
返回的结果表按照 id 排序.
Accounts 表:
id 是该表主键.
该表包含账户 id 和账户的用户名.
id | name |
---|---|
1 | Winston |
7 | Jonathan |
Logins 表:
该表无主键, 可能包含重复项.
该表包含登录用户的账户 id 和登录日期. 用户也许一天内登录多次.
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 |
结果表格式如下例所示:
id | name |
---|---|
7 | Jonathan |
id = 1 的用户 Winston 仅仅在不同的 2 天内登录了 2 次, 所以, Winston 不是活跃用户.
id = 7 的用户 Jonathon 在不同的 6 天内登录了 7 次, , 6 天中有 5 天是连续的, 所以, Jonathan 是活跃用户.
解法一 窗口函数lead +datediff
1)去重
因为登录表汇总了多个日期和id 号,同一天可能回登录多次,我们只需要一个登录日期。所以需要先group by id, login_date
去重。
2)datediff +lead
再用lead(login_date,4)over()窗口函数查找往下第4个登录日期是否与当前日期相差4天,即连续5天。
select distinct t.id,a.name
from (selectid, login_date,datediff(lead(login_date, 4) over(partition by id order by login_date),login_date) as diff from loginsgroup by id, login_date) as t
left join accounts a using(id)
where t. diff = 4
解法二:自连接
logins自连接后,限制条件有:
1) id 相同;
2)日期相差0-4天。
最后找出符合条件的日期合计达到5个的id。
如下表所示,如果有连续登录5天,那么在diff列在0-4范围内的会有5行。
连续登录5天的情况:
date | date2 | diff |
---|---|---|
t | t | 0 |
t | t-1 | 1 |
t | t-2 | 2 |
t | t-3 | 3 |
t | t-4 | 4 |
第二天没有登录的情况:
date | date2 | diff |
---|---|---|
t | t | 0 |
t | t-1 | 1 |
t | t-3 | 3 |
t | t-4 | 4 |
select distinct a.id,a.name
from (select a.id, a.login_date as ad, b.login_date as bdfrom logins ajoin logins bon a.id = b.id and datediff(a.login_date,b.login_date) between 0 and 4group by a.id, a.login_datehaving count(distinct b.login_date) = 5) as t
left join accounts a on a.id = t.id
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/active-users
SQL练习题:连续登录5天的活跃用户相关推荐
- SQL——最大连续登录天数、当前连续登录天数、最大连续未登录天数问题、连续登陆N天用户、连续座位号
问题: 最大连续登录天数 当前连续登录天数 最大连续未登录天数 连续登陆3天用户(三种方法) 选出连续座位的编号 前三个问题所用数据: 原数据表:user_active表 表字段:用户.新增日期.活跃 ...
- Hive sql : 查询连续登录天数
查询连续登录天数 1.问题描述 2.在Hive中建表 3.查询最大连续登录天数 1.问题描述 目前有两列数据,分别是用户ID和用户登录的时间,现需要统计用户连续登录的最大天数,中间如有断开,则不算连续 ...
- redis-bitmap实际运用统计用户登录天数和每天活跃用户
redis bitmap实际运用一统计用户登录天数 第一个听需求如果你的公司有用户系统,有很多用户.然后这时候需求是什么? 统计未来用户的登录天数,且窗口随机.什么意思?比如说在电商的公司当中,电商的 ...
- LeetCode MySQL 1454. 活跃用户(连续dense_rank排名函数)
文章目录 1. 题目 2. 解题 1. 题目 表 Accounts: +---------------+---------+ | Column Name | Type | +------------- ...
- mysql 连续登录天数
已知表名:csdata,表中有两个字段:user_id,log_time 问:用户连续登录天数为3的是?. user_id log_time 111111 2022/12/12 00:00:00 11 ...
- 【MySQL】MySQL统计连续登录3天的用户
需求 假设有下列表(user_login),第一列为id,第二列为登陆时间(dt),该表记录了每个id的登陆时间 现在要统计指定7天内连续登录3天以上的用户,结果如下 解决方案 由于存在同一用户同一天 ...
- Redis高级类型(统计全站访问量,日活跃用户)
HyperLogLog(超级日志)(统计访客) 采用一种基数算法,用于完成独立总数的统计 占据空间小,无论统计多少个数据,只占12K的内存空间 不精确的统计算法,标准误差为0.81% Bitmap(位 ...
- redis位图法统计活跃用户+统计3天的连续登录用户案例
Setbit 场景: 1亿个用户, 每个用户 登陆/做任意操作 ,记为今天活跃,否则记为不活跃 用法 周一:1001 0001 1001 0101 1011 0101 周二:1101 0001 101 ...
- SQL(之二)-查询“最长连续登录天数“
0-创建表及插入测试数据 说明:本文主要想分享,如何查询"最长连续登录天数",具体的测试数据,可以自行添加. CREATE TABLE USER_LOGINFO( USER_ID ...
最新文章
- 如何才能做好绩效管理?
- 物联网概念升级,万物互联来袭
- codeforces 126B Password(哈希)
- 数据库连接池为什么要用threadlocal呢?(不用会怎样?)
- 首届Elastic社区技术大会隆重开幕!腾讯分享2场中文演讲
- 复制linux内核,linux内核写时复制机制源代码解读
- k6前级效果器怎么用_新手学习电吉他,效果器应选择单块还是综合?
- 20145309李昊《网络对抗》MSF应用基础
- 一些大厂的css reset 代码
- 深度学习2.0-5.tensorflow的基础操作之前向传播(张量)实战
- JAVA 项目中使用 H2 数据库
- 用台达PLC485通信控制11台英威腾变频启动停止速度设定
- android 设内网固定ip,如何给手机设置一个固定的内网ip
- CodeIgniter入门
- 计算机网络基础之互联网总结
- 使用fiddler实现苹果ios手机抓包
- IntelliJ IDEA破解版 2017.3.4 Ultimate下载安装和JetbrainsCrack-2.7.jar激活教程
- Error during export:Export job failed !
- 视觉系统:人类最重要的感觉
- Paper之EfficientDet: 《Scalable and Efficient Object Detection—可扩展和高效的目标检测》的翻译及其解读
热门文章
- 积水的城市(SPFA)
- STM32学习笔记1-----初识stm32F429IGT6
- 10-15 查询未登记成绩的学生(MSSQL)
- 在 LINQ to Entities 查询中无法构造实体或复杂类型
- 合肥三维动画公司,安徽地产企业宣传片,合肥做地产三维动画公司,蚌埠房地产制作公司,合肥产品三维动画公司
- Spark学习笔记(7)——RDD行动算子
- C#自动更新Excel报表而不改变原有样式(2021.8.11)
- wiiliam -学画彩虹
- 【重磅推荐】centos7新装系统基础环境配置流程【完整搬家基本软件安装】
- Loading class 'com.mysql.jdbc.Driver', This is deprecated. The new driver class is'com.cj.jdbc.Driv'