公众号(阿龙学堂):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) lagdtfrom test3;记为 t1得到:1001    2021-12-12  1970-01-011001    2021-12-13  2021-12-121001    2021-12-14  2021-12-131001    2021-12-16  2021-12-141001    2021-12-19  2021-12-161001    2021-12-20  2021-12-19

第二步:将当前行时间减去上一行时间数据(datediff(dt1,dt2))

select    id,    dt,    datediff(dt,lagdt) flagfrom t1; 记为 t2得到:1001    2021-12-12  5645641001    2021-12-13  11001    2021-12-14  11001    2021-12-16  21001    2021-12-19  31001    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) flagfrom t2;记为 t3得到:1001    2021-12-12  11001    2021-12-13  11001    2021-12-14  11001    2021-12-16  11001    2021-12-19  21001    2021-12-20  2

第四步:按照用户和flag分组,求最大时间减去最小时间并加上1

select    id,    flag,    datediff(max(dt),min(dt)) daysfrom t3group by id,flag; 记为 t4得到:1001    51001    2

第五步:取连续登录天数的最大值

select    id,    max(days)+1from    t4group by id;得到:1001    51002    2 (1002用户明细略)

第六步:将SQL拼接起来​​​​​​​

select    id,    max(days)+1from(    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)t4group by id;

SqlBoy:间隔连续问题相关推荐

  1. 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- ...

  2. 最大连续1的个数 三 窗口大小固定,逻辑连续但实际上并不连续的滑动窗口

    1004 最大连续1的个数 三 窗口大小固定,逻辑连续但实际上并不连续的滑动窗口 题目描述 给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 . 返回仅包含 1 的 ...

  3. 在某个时间段查找某连续出现问题

    语法 ROW_NUMBER() OVER(PARTITION BY 列名1 ORDER BY 列名2) ROW_NUMBER()是一个SQL server函数,它为结果集的分区中的每一行分配一个连续的 ...

  4. 《预训练周刊》第29期:Swin Transformer V2:扩大容量和分辨率、SimMIM:用于遮蔽图像建模的简单框架...

    No.29 智源社区 预训练组 预 训 练 研究 观点 资源 活动 关于周刊 本期周刊,我们选择了10篇预训练相关的论文,涉及图像处理.图像屏蔽编码.推荐系统.语言模型解释.多模态表征.多语言建模.推 ...

  5. FPGA的设计艺术(17)如何搭建一个简易的逻辑测试平台?

    前言 提到FPGA逻辑的仿真,一般指的是行为仿真或者功能仿真,还有人会称为前仿,不包含时间延迟信息,只验证逻辑功能.对于小模块的仿真,需要写一个测试文件,英文是testbench,即测试平台.在tes ...

  6. 802.11N blockACK

    802.11n最主要的添加了Block Ack这个技术,但是在实际应用中对于BA还是知之甚少,转贴一个讲述BA基本原理的文章,但是我通过wireshark进行抓报并没有在BAR(Block Ack R ...

  7. 802.11协议之BA/BAR帧

    802.11n最主要的添加了Block Ack这个技术,但是在实际应用中对于BA还是知之甚少,转贴一个讲述BA基本原理的文章,但是我通过wireshark进行抓报并没有在BAR(Block Ack R ...

  8. mpvue 微信小程序api_第三方框架与原生微信小程序开发框架性能之比较 | Q荐读...

    作者 | 崔红保编辑 | 王莹 自 2017年1月9日微信小程序诞生以来,历经 2 年多的迭代升级,已有数百万小程序上线,成为继 Web.iOS.Android 之后,第四大主流开发技术. 与之相随, ...

  9. 南方rtk手簿使用说明书详解_学RTK必须要掌握的三大要领是什么?

    如果说RTK是测绘工作的核心,一点也不为过,RTK技术的运用极为广泛,比如在各种控制测量.地形测图.工程选线及工程放样中的应用等,它提高了作业效率和作业精度,这是其他常规仪器无法比拟的.在整个GPS应 ...

最新文章

  1. Chapter 3 Phenomenon——23
  2. mysql数据库一些可能会用到的命令
  3. Win32 汇编要点总结
  4. 用json 数据生成mysql 表_根据json数据生成表格
  5. 论文浅尝 | GMNN: Graph Markov Neural Networks
  6. opencv 图像访问索引
  7. python一元加号_Python一元方程解算系统(需要Sympy库支持)
  8. python __new__中单例的作用
  9. 洛谷 P1426 小鱼会有危险吗(C语言)
  10. 我在德国做SAP CRM One Order redesign工作的心得 1
  11. 收集4:文件打开方式
  12. 学生成绩查询html,中学生成绩查询用的一个网站叫什么行
  13. Mac Sublime Text 3插件安装
  14. 小说我成了机器人桑尼_我在月球当皇帝
  15. 解三对角矩阵以及循环三对角矩阵方程的数值计算方法
  16. c 语言百度翻译软件,百度翻译api 实现简易微信翻译小程序
  17. Scintilla Markers Margins
  18. 去除小圆点_word中的小圆圈怎么删掉
  19. python中round(18.67、-1)_Python torch.round方法代码示例
  20. centos7挂载nas存储_CentOS 7配置NAS(网络共享存储)

热门文章

  1. 写一段java链接图灵机器人的代码
  2. 架构设计(7)—如何设计架构和画架构图
  3. 联想小新air13pro重装系统_联想小新Air 13 Pro笔记本安装win10系统教程
  4. 如何修复dns服务器超时,与dns连接超时怎么解决
  5. Android 4.0 全屏显示,在我的原道n90 ICS 4.0.3版本实验通过
  6. 数组 (Array)
  7. android 图解 PhotoView,从‘百草园’到‘三味书屋’!
  8. 泊位 matlab,一种基于环视相机的自动泊车方法 | 厚势汽车
  9. linux 数据库备份
  10. LeetCode每日一题(持续更新中~~~)