hiveSql 跨N天最大连续统计

news2024/11/17 9:44:30

hiveSql 跨N天最大连续统计

    • 说明
    • 需求
    • 分析
    • 实现
    • 最后

说明

看到标题可能没太能理解,什么叫跨N天连续?这里解释下:
跨N天连续定义为:登录相隔天数小于N
用跨2天举例(即隔一天也算连续登录)
例如 :
2022-01-01 与 2022-01-02算连续
2022-01-01 与 2022-01-03也算连续(隔了一个2022-01-02 但是也算连续登录)
2022-01-01 与 2022-01-04则不算连续了(隔了2天不算连续了)

需求

有数据如下:
表:tmp_login

id	dt
1001	2021-12-12
1001	2021-12-13
1001	2021-12-14
1001	2021-12-16
1001	2021-12-19
1001	2021-12-20
1001	2021-12-26
1001	2021-12-27
1001	2021-12-29
1002	2021-12-12
1002	2021-12-16
1002	2021-12-17

字段:
id:用户ID
dt:用户登录日期

希望计算每个用户的最大连续登录天数,这里的连续定义为小于2天。即隔一天也算连续登录
基于上述明细数据,期望获得以下数据:

idmax_days
10015
10022

1001:是2021-12-12到2021-12-16号 5天
1002:是2021-12-16到2021-12-17号 2天


到这里可以先思考下用hiveSql怎么实现

分析

对于严格每天登录,这个逻辑来计算最大连续登录天数,很容易想到,将用户登录日期排序,用登录日期减去排序序号,则按照减完之后的日期分组统计天数即可。但是现在隔一天也算连续,这种方式貌似实现不了,减完之后的日期会被分到多组中。所以最关键的点在于怎么把满足上述定义的连续的日期分到同一个组里,然后聚合组内天数即可。容易想到,在给每个用户的登录日期排序后,将相邻的两个日期做差,差值大于2的有一个断点,后续利用这个断点做日期分组。这种思路也叫做重分组思想。

有了上述思路,下面逐步完成sql编写

实现

  • 1.将用户登录日期排序,排序后相邻日期做差值
select
	id,dt,
	lag(dt,1,dt) over(partition by id order by dt) as previous_dt,
	datediff(dt,lag(dt,1,dt) over(partition by id order by dt)) as adjacent_dt_diff
from tmp_login

previous_dt:当前日期的升序排序后前一个日期
adjacent_dt_diff:当前日期 与 升序排序后前一个日期相差的天数
有结果如下:
在这里插入图片描述

  • 2.有相差天数后,可以按照需求定义小于什么差值是连续,这里是小于两天为连续。可以根据adjacent_dt_diff值来定义上述分析中的断点
select 
	id,dt,previous_dt
	,if(adjacent_dt_diff>2,1,0) as flag
from
	(select
		id,dt,
		lag(dt,1,dt) over(partition by id order by dt) as previous_dt,
		datediff(dt,lag(dt,1,dt) over(partition by id order by dt)) as adjacent_dt_diff
	from tmp_login
	) t;

flag:这里即是断点,因为用户可能会有多段满足条件的连续,每段的第一天flag即为1。断点与断点之间的日期即是满足条件的连续日期了。
结果如下:
在这里插入图片描述
上述截图可以看到,用户1001,在2021-12-16 与 2021-12-19之间是超过2天的,即不连续。2021-12-19与2021-12-20有是下一段的连续,flag在2021-12-19这条上是1。

  • 3.上述断点有了之后,怎么讲每个断点间的日期分在同一组呢?这里可以利用开窗sum() over() 累加的方式分组:
select 
	id,dt,previous_dt,adjacent_dt_diff
	,if(adjacent_dt_diff>2,1,0) as flag
    ,sum(if(adjacent_dt_diff>2,1,0)) over (partition by id order by dt) as group_flag
from
	(select
		id,dt,
		lag(dt,1,dt) over(partition by id order by dt) as previous_dt,
		datediff(dt,lag(dt,1,dt) over(partition by id order by dt)) as adjacent_dt_diff
	from tmp_login
	) t;

group_flag:满足条件的分组字段
在这里插入图片描述
上述截图可以看到,每个用户id下满足条件的连续登录日期都按照group_flag分组了,接下来只需要做分组,取组内最大日期减去组内最小日期即可

  • 4.分组聚合,取组内最大最小日期天数差
select 
    id,max(days) as max_days
from
    (select 
        id,group_flag,datediff(max(dt),min(dt)) as days
    from
        (select 
            id,dt,previous_dt,adjacent_dt_diff
            ,if(adjacent_dt_diff>2,1,0) as flag
            ,sum(if(adjacent_dt_diff>2,1,0)) over (partition by id order by dt) as group_flag
        from
            (select
                id,dt,
                lag(dt,1,dt) over(partition by id order by dt) as previous_dt,
                datediff(dt,lag(dt,1,dt) over(partition by id order by dt)) as adjacent_dt_diff
            from tmp_login
            ) t
        ) t1
        group by id,group_flag
    ) t2
group by id

结果如下:
在这里插入图片描述
此处有个小的注意事项,最大日期 - 最小日期后加1。

  • 5.精简sql,完整sql如下:
select 
    id,max(days) as max_days
from
    (select 
        id,flag_sum,datediff(max(dt),min(dt))+1 as days
    from
        (select 
            id,dt,flag
            ,sum(flag) over(partition by id order by dt) as flag_sum
        from
            (select 
                id,dt,
                if(datediff(dt,lag(dt,1,dt) over(partition by id order by dt) ) > 2,1,0) as flag
            from tmp_login
            ) t
        ) t1
    group by id,flag_sum
    ) t2
group by id;

最后

喜欢的点赞、关注、收藏吧~ 感谢支持~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

书桌台灯怎么选?分享儿童卧室灯品牌

书桌少不了的就是台灯,从小到大,不管是学习还是工作,都离不开一张书桌,学生上学学习,书桌就是必不可少的一部分,而选择怎么样的台灯好呢? 最重要的是安全的的光线品质 在照明领域,光…

Matlab 实现 信号的基本运算

实验名称 利用 Matlab 软件的信号处理工具箱(Signal Processing Toolbox)中的专用函数来实现信号的基本运算。 包括 - * 时移、翻转、展缩 运算 实验环境 MATLAB - R2021b 实验目的 了解仿真基本的信号。 sin() 产生正弦信号 ysin(x) x 是自变量 可看做时间向量 plot() …

Quick MTF 照相机镜头图像质量测试程序-UPDATE

Quick MTF,图像质量测试应用程序 Quick MTF 可让您测试数字图像的质量。它具有精确的计算引擎和直观的用户界面,无需特殊培训即可轻松使用。只需使用 Quick MTF 打开测试图像并选择目标区域。 目的 Quick MTF 检查成像设备拍摄的图像质量,让…

【MySQL | 运维篇】07、MySQL 分库分表之 MyCat 管理与监控

目录 一、MyCat原理 二、MyCat管理 三、MyCat-eye 3.1 介绍 3.2 安装 1). zookeeper安装 2). Mycat-web安装 3.3 访问 3.4 配置 1). 开启MyCat的实时统计功能(server.xml) 2). 在Mycat监控界面配置服务地址 3.5 测试 A. 性能监控 B. 物理节点 C. SQL统计 …

【录用案例】CCF-B类,3区智能传感器类SCIEI,仅2个月录用

3区智能传感器类SCI&EI 【出版社】ACM 出版社 【期刊简介】IF:2.0-3.0,JCR3区,中科院4区 【检索情况】SCI&EI 双检,正刊,CCF-B类 【征稿领域】 ①智能城市的绿色通信和传感器网络与机器智能(已截稿&#…

【刷题】二叉树遍历思路解析

二叉树遍历 (牛客网) 题目要求: 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“…

预览ppt时中文乱码

现象:预览ppt时中文乱码 原因:该后端服务部署的主机没有指定中文字体 解决:用root角色在主机目录 /usr/share/fonts 上传Chinese字体文件 1、上传解压后,去应用上测试,发现页面全空白的, 且后台服务日志…

擎创技术流 | ckman教程(3)CKman源码分析部署集群的主要步骤

叮~您有一个新的技术分享已送达,请注意查收~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 哈喽,各位知乎友友们~ckman使用教程分享已经到第3期啦,不知道大家都掌握了没有呢?没有的话也没关系,点击下方链接,一键回…

centos7 + mysql 8 安装confluence7.19.3

一、安装包下载 1、访问下载连接,进行下载最新的安装包 Confluence Server 下载存档 | Atlassian mkdir -p /data/soft cd /data/soft wget https://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-7.19.3.tar.gz 2、数据库准备 …

单元测试(jest):理解、安装、使用

一、理解单元测试的重要性 bug发现在开发阶段,成本很低, 如果发现在生产环境,成本很高, 如果是关键时刻,决定人生命运,决定企业发展。 从技术的角度讲,有效的提高代码的健壮性,有效…

GO语言集成开发工具环境JetBrains GoLand 2022

JetBrains GoLand 2022是一款专业的GO语言编程软件。JetBrains GoLand支持编码辅助功能,IDE会分析你的代码,然后在符号之间寻找连接。提供代码提示,快速导航,灵活的错误分析能力以及格式化和重构功能。JetBrains GoLand 2022 强大…

docker安装es+mac安装Kibana工具+es查询语法笔记

一、docker安装es 1、下载镜像 docker pull elasticsearch:7.9.0下载完后,查看镜像 docker images​​ 2、启动镜像 docker network create esnetdocker run -d --name es -p 9200:9200 -p 9300:9300 --network esnet -e "discovery.typesingle-node&…

图解CentOS7集群时钟同步chronyd

文章目录概述图步骤1、修改时区2、安装chrony3、选1台机作为时钟服务器4、其他机器同步时间概述 对于物理机集群,需要使用统一的时间,本文使用时钟同步技术来实现 图 图解 默认的 外部网络的 时钟服务器 在国外,速度较慢 0.centos.pool.n…

(表格固定尾列)bower安装的相关问题

遇到需求固定表格尾列,尾列是操作(查看,删除)这些 尝试了css,js,jquery,插件,layui,elementui各种都没用 freeze-table(一个固定表格插件) npm i…

【父母必知】呼吸过敏知多少

“吃完鸡蛋后全吐了,是过敏吗?”“湿疹怎么不经意间又出现了,到底吃了什么”“咳嗽总是不好,都说我们是过敏性咳嗽,对什么过敏?”“小时候,湿疹肠绞痛跑到医院,现在鼻炎哮喘还跑到医…

计算机对字节的七种操作

计算机对字节的处理有七种:复制,左移,右移,非,与,或,异或。本篇将回顾一下这几种操作的具体底层实现 四种常见的门结构 到目前为止,我们已经使用了NAND、AND和NOT门。我们需要定义另…

基于soft-RoCE运行OSU Micro Benchmark

之前的文章描述了如何运行Benchmark,但是那个是基于TCP的。现在想要跑一个基于RoCEv2的结果。虚拟机上没有支持infiniband的网卡,那就用Soft RoCE了。 Soft-RoCE的安装和调试 系统版本信息 adminosu-1:~$ uname -a Linux osu-1 5.11.0-44-generic #48~…

1.1 极限的概念

1.1 极限的概念 1.1.1 数列的极限 引言 在物理实验中,如果涉及到测量,那么误差总是存在的。误差是在正确实验的情况下实验测量值与理论值之间的差值。如果理论是正确的并且使用更精密的实验仪器或改进实验方法,那么测量值就会更加接近理论…

sql server卡慢问题定位和排查

一、数据库服务器资源排查 二、数据库sql性能排查 2.1、查询哪些资源被阻塞了 和 堵进程 1)、查询哪些资源被阻塞了(spid为阻塞进程id) select * from sys.sysprocesses where status suspended 2)、查询堵进程…

基于springboot的疫情防控管理系统

1、项目介绍 基于springboot的疫情防控管理系统拥有两种角色:管理员和用户 管理员:用户管理、隔离地点管理、隔离人员管理、防护用具管理、消毒管理、生活需求管理、体温上报管理、核酸结果管理、配餐管理、物资配送管理、隔离解除管理等 用户&#x…