数据:

User_id  login_date
1001    2021-08-02
1001    2021-08-01
1001    2021-08-03
1001    2021-08-05
1001    2021-08-06
1001    2021-08-07
1001    2021-08-10
1001    2021-08-12
1002    2021-08-01
1002    2021-08-02
1002    2021-08-03
1002    2021-08-07
1002    2021-08-09
1002    2021-08-11
1002    2021-08-13
1002    2021-08-15

建表语句:

DROP TABLE IF EXISTS `login`;
CREATE TABLE `login`  (`user_id` int NOT NULL,`login_date` date NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = gbk COLLATE = gbk_chinese_ci ROW_FORMAT = Dynamic;INSERT INTO `login` VALUES (1001, '2021-08-02');
INSERT INTO `login` VALUES (1001, '2021-08-01');
INSERT INTO `login` VALUES (1001, '2021-08-03');
INSERT INTO `login` VALUES (1001, '2021-08-05');
INSERT INTO `login` VALUES (1001, '2021-08-06');
INSERT INTO `login` VALUES (1001, '2021-08-07');
INSERT INTO `login` VALUES (1001, '2021-08-10');
INSERT INTO `login` VALUES (1001, '2021-08-12');
INSERT INTO `login` VALUES (1002, '2021-08-01');
INSERT INTO `login` VALUES (1002, '2021-08-02');
INSERT INTO `login` VALUES (1002, '2021-08-03');
INSERT INTO `login` VALUES (1002, '2021-08-07');
INSERT INTO `login` VALUES (1002, '2021-08-09');
INSERT INTO `login` VALUES (1002, '2021-08-11');
INSERT INTO `login` VALUES (1002, '2021-08-13');
INSERT INTO `login` VALUES (1002, '2021-08-15');

方法一:等差数列法,不灵活

selectuser_id,max(continuous) max_continuous
from (select -- sum(days)是指间隔连续的天数,而count(*)-1是间隔连续的天数中间的值,-- 比如1,3,5天,sum(days)=3,而count(*)-1就是2,4这两天user_id,sum(days)+count(*)-1 continuousfrom (selectuser_id,flag_1,days,-- 再继续对flag_1等差,这样算出来的相同的日期就是间隔了一天的date_sub(flag_1,interval row_number() over(partition by user_id order by flag_1) day) flag_2from (select -- 查询出绝对连续的天数user_id,flag_1,count(1) daysfrom (selectuser_id,login_date,-- 连续的日期flag_1是相同,而隔了一天的日期flag_1是差一天的DATE_SUB(login_date,interval row_number() over(partition by user_id order by login_date) day) flag_1from login) t1 group by user_id,flag_1) t2) t3 group by user_id,flag_2 )t4 group by user_id

方法二:现上分组法,灵活,可指定间隔n天连续

select-- 按id分组,求最大的连续天数user_id,max(continuous_login_days) max_continuous_login_days
from (select-- 将组内最大日期和最小日期相减+1就是连续天数user_id,datediff(max(login_date),min(login_date))+1 continuous_login_daysfrom (selectuser_id,login_date,-- 超过2天以上的新开一组,因为sum默认是最前行到当前行,差值不到2天的会sum(0),就等于没加-- 若断2天算连续,这里就改为sum(if(diff>3,1,0))sum(if(diff>2,1,0)) over(partition by user_id order by login_date) group_idfrom (selectuser_id,login_date,datediff(login_date,prev_day) diff -- 计算与前一天的差值from(selectuser_id,login_date,lag(login_date,1,"1970-01-01") over(partition by user_id order by login_date) prev_dayfrom login) t1 ) t2 ) t3group by user_id,group_id ) t4
group by user_id

结果:

user_id max_continuous
1001 7
1002 9

mysql/hive求最大连续天数(间隔1天也算连续)相关推荐

  1. mysql 连续天数_mysql计算连续天数,mysql连续登录天数,连续天数统计

    mysql计算连续天数,mysql连续登录天数,连续天数统计 >>>>>>>>>>>>>>>>>& ...

  2. hive连续天数统计思路

    测试数据: T1 Uid dt login_status(1登录成功,0异常) 1 2019-07-11 1 1 2019-07-12 1 1 2019-07-13 1 1 2019-07-14 1 ...

  3. Hive 统计连续天数

    第一步:创建表 -- 创建表 create table if not exists continue_days( uid int comment '员工id', tdate string commen ...

  4. oracle求指定时间连续天数

    需求:得到指定时间开始往前数连续的天数,如id为a的数据对应时间:20200115,20200114,20200112,20200101,给定查询时间为20200115,则连续天数为2,一中断就终止 ...

  5. Ubuntu18.04 MySQL+hive安装

    Ubuntu18.04 MySQL+hive安装 参考文档.博客: https://blog.csdn.net/chengyuqiang/article/details/76757602 https: ...

  6. C语言实现“输入年月求对应月份天数”

    C语言实现"输入年月求对应月份天数" 一.运行截图 二.源代码 一.运行截图 二.源代码 #include<stdio.h> main() {int x, y, a, ...

  7. 如何计算CDS view里两个时间戳之间的天数间隔

    ABAP透明表里的时间戳,数据类型为dec: 有个需求:计算这两个时间戳之间的天数间隔,丢弃时间戳年-月-日8位后面的小时:分钟:秒. 举个例子:如果时间戳是20180918173132,丢弃1731 ...

  8. hadooppythonsql_半小时搞定Hadoop+Mysql+Hive+Python

    1. 说明 搭建过Hadoop集群的小伙伴一定知道,如果不用docker,半小时配好Hadoop+Mysql+Hive(后简称Hive)肯定是胡吹,有了Docker镜像,没有说明文档,配好了也不一定会 ...

  9. hive 把mysql语句执行_R分别连接mysql hive执行操作

    大半年忘记更新工作记录了,惭愧,慢慢补上. mysql/hive 是两类常用的不同类型的数据库,在数据操作上存在一定的区别. 1-MYSQL的连接. ​library(DBI) library(RMy ...

最新文章

  1. Go 分布式学习利器(20)-- Go并发编程之多路选择和超时控制,channel的关闭和广播
  2. android浮于上方布局,android-在FrameLayout中使RecyclerView上方的视图...
  3. 使用apache配置基于IP地址的虚拟主机
  4. 6-12mysql库的操作
  5. yii2中的rules验证规则
  6. mysqld:表mysql.plugin不存在_99%测试工程师不知道的数据库知识|干货
  7. Tecplot如何保存frame style 并调用frame style
  8. 帆软FineMobile 消息推送/定时调度
  9. python JEP安装
  10. 【Java EE】Day10 JavaScript高级、DOM、BOM、事件
  11. 【Java编码规范】《阿里巴巴Java开发手册(正式版)》
  12. Siemens M65...
  13. 开票接口系统能够解决的十大问题
  14. java 动态性之反射机制 详解 案例,java架构师技术图谱
  15. 数字逻辑计算机组成,数字逻辑设计与计算机组成pdf
  16. 困惑很久的解微分方程时绝对值取舍问题(必看)
  17. 十款强大的图像后期处理软件和工具
  18. 什么是异常?如何处理异常?
  19. 读书笔记 | 牧羊少年奇幻之旅
  20. 从计算机视觉角度深入解读了AR

热门文章

  1. 2022-2028年全球与中国工业分析软件市场现状及未来发展趋势分析报告
  2. java毕业设计的影视资讯管理系统mybatis+源码+调试部署+系统+数据库+lw
  3. springboot银行客户管理系统毕业设计源码250903
  4. 《web课程设计》用HTML CSS做一个简洁、漂亮的个人博客网站
  5. 学土木的考计算机二级的什么好些,学土木适合考计算机二级考什么?
  6. 高精度乘法(c++实现)
  7. Android NDK Camera2小结
  8. 2019,GECCO,Linear scaling with and within semantic backpropagation-based genetic programming for SR
  9. Perforce介绍
  10. python 分类变量xgboost_python小白之路:第十九章 XGBoost