SqlBoy:间隔连续问题
公众号(阿龙学堂):SqlBoy:经典面试题-间隔连续问题
一、需求
某游戏公司记录的用户每日登录数据
计算每个用户最大的连续登录天数,可以间隔一天。解释:如果一个用户在 1,3,5,6 登录游戏,则视为连续 6 天登录。
二、分析
先将数据按照id,dt排序后得到:
依题意分析得到:
1001用户12、13、14、16号为连续登录,连续天数为5
1001用户19、20号为连续登录,连续天数为2
1002用户12号为连续登录,连续天数为1
1002用户16、17号为连续登录,连续天数为2
如果我们将以上四种情况分为四组,那四组的连续天数计算方式分别为:max(dt)-min(dt)+1,即
16-12+1=5
20-19+1=2
12-12+1=1
17-16+1=2
由此可见,该类问题就可以转换为,先将数据进行分组,再由组内最大日期减最小日期+1得到。分组问题也就是第二题。
以1001用户的数据为例,流程应该是:
三、解法
第一步:将上一行时间数据下移
select
id,
dt,
lag(dt,1,'1970-01-01') over(partition by id order by dt) lagdt
from test3;记为 t1
得到:
1001 2021-12-12 1970-01-01
1001 2021-12-13 2021-12-12
1001 2021-12-14 2021-12-13
1001 2021-12-16 2021-12-14
1001 2021-12-19 2021-12-16
1001 2021-12-20 2021-12-19
第二步:将当前行时间减去上一行时间数据(datediff(dt1,dt2))
select
id,
dt,
datediff(dt,lagdt) flag
from t1; 记为 t2
得到:
1001 2021-12-12 564564
1001 2021-12-13 1
1001 2021-12-14 1
1001 2021-12-16 2
1001 2021-12-19 3
1001 2021-12-20 1
第三步:按照用户分组,同时按照时间排序,计算从第一行到当前行大于2的数据的总条数(sum(if(flag>2,1,0)))
select
id,
dt,
sum(if(flag>2,1,0)) over(partition by id order by dt) flag
from t2;记为 t3
得到:
1001 2021-12-12 1
1001 2021-12-13 1
1001 2021-12-14 1
1001 2021-12-16 1
1001 2021-12-19 2
1001 2021-12-20 2
第四步:按照用户和flag分组,求最大时间减去最小时间并加上1
select
id,
flag,
datediff(max(dt),min(dt)) days
from t3
group by id,flag; 记为 t4
得到:
1001 5
1001 2
第五步:取连续登录天数的最大值
select
id,
max(days)+1
from
t4
group by id;
得到:
1001 5
1002 2 (1002用户明细略)
第六步:将SQL拼接起来
select
id,
max(days)+1
from(
select
id,
flag,
datediff(max(dt),min(dt)) days
from(
select
id,
dt,
sum(if(flag>2,1,0)) over(partition by id order by dt) flag
from(
select
id,
dt,
datediff(dt,lagdt) flag
from (
select
id,
dt,
lag(dt,1,'1970-01-01') over(partition by id order by dt) lagdt
from test3
)t1
)t2
)t3
group by id,flag
)t4
group by id;
SqlBoy:间隔连续问题相关推荐
- mysql/hive求最大连续天数(间隔1天也算连续)
数据: User_id login_date 1001 2021-08-02 1001 2021-08-01 1001 2021-08-03 1001 2021-08-05 1001 2021-08- ...
- 最大连续1的个数 三 窗口大小固定,逻辑连续但实际上并不连续的滑动窗口
1004 最大连续1的个数 三 窗口大小固定,逻辑连续但实际上并不连续的滑动窗口 题目描述 给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 . 返回仅包含 1 的 ...
- 在某个时间段查找某连续出现问题
语法 ROW_NUMBER() OVER(PARTITION BY 列名1 ORDER BY 列名2) ROW_NUMBER()是一个SQL server函数,它为结果集的分区中的每一行分配一个连续的 ...
- 《预训练周刊》第29期:Swin Transformer V2:扩大容量和分辨率、SimMIM:用于遮蔽图像建模的简单框架...
No.29 智源社区 预训练组 预 训 练 研究 观点 资源 活动 关于周刊 本期周刊,我们选择了10篇预训练相关的论文,涉及图像处理.图像屏蔽编码.推荐系统.语言模型解释.多模态表征.多语言建模.推 ...
- FPGA的设计艺术(17)如何搭建一个简易的逻辑测试平台?
前言 提到FPGA逻辑的仿真,一般指的是行为仿真或者功能仿真,还有人会称为前仿,不包含时间延迟信息,只验证逻辑功能.对于小模块的仿真,需要写一个测试文件,英文是testbench,即测试平台.在tes ...
- 802.11N blockACK
802.11n最主要的添加了Block Ack这个技术,但是在实际应用中对于BA还是知之甚少,转贴一个讲述BA基本原理的文章,但是我通过wireshark进行抓报并没有在BAR(Block Ack R ...
- 802.11协议之BA/BAR帧
802.11n最主要的添加了Block Ack这个技术,但是在实际应用中对于BA还是知之甚少,转贴一个讲述BA基本原理的文章,但是我通过wireshark进行抓报并没有在BAR(Block Ack R ...
- mpvue 微信小程序api_第三方框架与原生微信小程序开发框架性能之比较 | Q荐读...
作者 | 崔红保编辑 | 王莹 自 2017年1月9日微信小程序诞生以来,历经 2 年多的迭代升级,已有数百万小程序上线,成为继 Web.iOS.Android 之后,第四大主流开发技术. 与之相随, ...
- 南方rtk手簿使用说明书详解_学RTK必须要掌握的三大要领是什么?
如果说RTK是测绘工作的核心,一点也不为过,RTK技术的运用极为广泛,比如在各种控制测量.地形测图.工程选线及工程放样中的应用等,它提高了作业效率和作业精度,这是其他常规仪器无法比拟的.在整个GPS应 ...
最新文章
- Chapter 3 Phenomenon——23
- mysql数据库一些可能会用到的命令
- Win32 汇编要点总结
- 用json 数据生成mysql 表_根据json数据生成表格
- 论文浅尝 | GMNN: Graph Markov Neural Networks
- opencv 图像访问索引
- python一元加号_Python一元方程解算系统(需要Sympy库支持)
- python __new__中单例的作用
- 洛谷 P1426 小鱼会有危险吗(C语言)
- 我在德国做SAP CRM One Order redesign工作的心得 1
- 收集4:文件打开方式
- 学生成绩查询html,中学生成绩查询用的一个网站叫什么行
- Mac Sublime Text 3插件安装
- 小说我成了机器人桑尼_我在月球当皇帝
- 解三对角矩阵以及循环三对角矩阵方程的数值计算方法
- c 语言百度翻译软件,百度翻译api 实现简易微信翻译小程序
- Scintilla Markers Margins
- 去除小圆点_word中的小圆圈怎么删掉
- python中round(18.67、-1)_Python torch.round方法代码示例
- centos7挂载nas存储_CentOS 7配置NAS(网络共享存储)
热门文章
- 写一段java链接图灵机器人的代码
- 架构设计(7)—如何设计架构和画架构图
- 联想小新air13pro重装系统_联想小新Air 13 Pro笔记本安装win10系统教程
- 如何修复dns服务器超时,与dns连接超时怎么解决
- Android 4.0 全屏显示,在我的原道n90 ICS 4.0.3版本实验通过
- 数组 (Array)
- android 图解 PhotoView,从‘百草园’到‘三味书屋’!
- 泊位 matlab,一种基于环视相机的自动泊车方法 | 厚势汽车
- linux 数据库备份
- LeetCode每日一题(持续更新中~~~)