Hive SQL必刷练习题:连续问题 间断连续(*****)

问题描述:

1) 连续问题:找出连续三天(或者连续几天的啥啥啥)。

2) 间断连续:统计各用户连续登录最长天数,间断一天也算连续,比如1、3、4、6也算登陆了6天

问题分析:

这两类问题,都是涉及到连续,只不过连续类问题只要判断出来相邻的时间是和当前行的时间挨着即可,而间断连续,是还可能在期间有中断现象,并且即使中断了,也要算在连续的时间内,比如1、3、4、6号登录,但是算是连续登陆了6天。所以只要中断不超过两天,也能判断出来是连续的,并且在计算连续天数的时候还要算上这个时间。

解决思路:

1)针对连续问题:

可以通过对每一个用户id进行开窗,然后排序里面的时间,加上row_number(),这样对每一个日期都会有一个排序,之后将日期减去排序序号,只要这个值是一样的,就说明这几天是连续的。之后只要根据用户id,以及这个减去过排序序号的差值diff进行一起group by分组,然后通过having count(*) >= 3,这个筛选条件过滤出的结果就是最终连续登录了三天的用户

2)针对间断连续问题:

​ 也是对每一个用户id进行开窗,只不过这次是针对当前行,用lag()取上一行数据。【必须要看上一行,而不是看下一行,因为如果当前行开始变化,当前行需要记录,如果看下一行,那看的是下一行有没有变化,是不是不连续了之类的,下一行的情况无法记录】。之后用当天日期对这个用开窗函数得到的上一天日期进行相减,如果大于2,就说明相邻两天的日期是超过了2天,按照定义不算是“连续”,所以增加个标记,记录为1,这样每一行都会有一个标记,如果是连续的,那这一行后面就标记的0

​ 接下来就是关键的步骤,根据**用户id进行开窗求sum聚合group by,然后从最开始的一行,到当前行,进行求sum。**这样的话,原本是1、0、0、1、0、1、0,比如是这样的标记序列,每到一个1就说明从这天开始,就不是间断一天连续了,然后从最开始一行到当前行求sum的结果就是,1、1、1、2、2、3、3。这就很好的划分出来三段“间断连续时间”。

​ 然后根据用户id,以及这个标记进行分组聚合group by,求出来这个期间日期的max,以及日期的min,相减,别忘了再加1【日期计算时候需要注意的】,就是这个间断连续的天数了。

总结:

​ 所以总的来说,要么就是用开窗函数对日期进行排序,然后当前日期减去排序序号,去看日期一样的就是连续操作的记录

​ 当然,如果想用统计间断连续的方法去看连续n天的问题,也可以,就是取一个lag(),或者取一个lead(),进行开窗,不用加标记,直接一个where过滤diff=2,这就是统计连续3天的用户,不过同一个用户可能会有多个这个符合条件的,最后需要去重count(distinct(user_id)) 。如果是为了找到连续3天登录过的用户

​ 要么就是利用开窗函数取得上一行lag()日期,两个日期相减,去判断是否符合条件,接下来加一个标记,不符合的设为1,用作记录改变的时间点,其余标0。然后开窗函数对标记进行求和,是从第一条到当前条,这样就可以看出来一个用户id,划分了几个连续时间段,然后再根据需求去具体的求。

然后上代码:

1) 连续:

在这里插入图片描述

2) 间断连续

selectuser_id,max(recent_days) max_recent_days  --求出每个用户最大的连续天数
from
(selectuser_id,user_flag,datediff(max(login_date),min(login_date)) + 1 recent_days --按照分组求每个用户每次连续的天数(记得加1)from(selectuser_id,login_date,lag1_date,concat(user_id,'_',flag) user_flag --拼接用户和标签分组from(selectuser_id,login_date,lag1_date,sum(if(datediff(login_date,lag1_date)>2,1,0)) over(partition by user_id order by login_date) flag  --获取大于2的标签from(selectuser_id,login_date,lag(login_date,1,'1970-01-01') over(partition by user_id order by login_date) lag1_date  --获取上一次登录日期from(selectuser_id,date_format(login_datetime,'yyyy-MM-dd') login_datefrom login_eventsgroup by user_id,date_format(login_datetime,'yyyy-MM-dd')  --按照用户和日期去重)t1)t2)t3)t4group by user_id,user_flag
)t5
group by user_id;)t2)t3)t4group by user_id,user_flag
)t5
group by user_id;

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins实现CICD(3)_Jenkins连接到git

文章目录 1、如何完成上述操作,并且不报如下错:2、连接不上git,操作如下:3、将上边产生的3个文件拷贝到:C:\Windows\System32\config\systemprofile\.ssh4、新建下图凭证:创建步骤: 5、公钥填到…

PHP-小皮创建php网站中遇到的问题及解决方案—我耀学IT

一、安装 1.1 在学习php时我们需要用到的软件有两个,一个时vscode,一个就是小皮面板(phpstudy) 1.2 vscode安装直接从官网下载,根据系统下载对应的版本,例如:windows64、linux等;同…

LeetCode 热题 100 | 回溯(三)

目录 1 131. 分割回文串 2 51. N 皇后 菜鸟做题,语言是 C,感冒好了 ver. 1 131. 分割回文串 题眼:给你一个字符串 s,请你将 s 分割 成一些子串。 根据题眼可知,我们需要做的是将字符串 s 连续分割 为几段&#…

分布式搜索引擎elasticsearch专栏一

初识elasticsearch 1.1了解ES elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在码云搜索代码 在电商网站搜索商品 在百度搜索答案 1.1.2.ELK…

Hadoop入门之Hadoop的组成

目录 Hadoop1.x和2.x的区别Hadoop组成HDFSYARNMapReduce 为什么说MR适合离线 Spark适合实时 Hadoop1.x和2.x的区别 高内聚 低耦合 Hadoop组成 HDFS HDFS-负责海量数据的存储: NameNode(nn):管理真实数据的元数据的(hdfs集群中的老大&am…

分布式事务的解决方案--Seata架构

一、Seata的XA模式 二、AT模式原理 三、TCC模式原理 四、MQ分布式事务 异步,非实时,实现最终的一致性。 四、分布式事务的解决方案

顶顶通呼叫中心中间件-群集配置方法讲解(mod_cti基于FreeSWITCH)

群集介绍 比较多的外呼或呼入系统,假如整个系统需要1万并发,单机最高就3000-5000并发,这时就需要多机群集了。顶顶通呼叫中心中间件使用redis数据库,多个FreeSWITHC(mod_cti)连接同一个redis就可以很容易的配置成群集系统。 想了…

Linux docker3--数据卷-nginx配置示例

一、因为docker部署服务都是以最小的代价部署,所以通常在容器内部很多依赖和命令无法执行。进入容器修改配置的操作也比较麻烦。本例介绍的数据卷作用就是将容器内的配置和宿主机文件打通,之后修改宿主机的配置文件就相当于修改了docker进程的配置文件&a…

Linux---基本操作命令之用户管理命令

1.1useradd 添加新用户 root用户:/root 普通用户:/home/ 创建的用户还是david,只是在dave文件夹下 1.2 passwd 设置密码 给用户tony设置密码: 123456 1.3 id 查看用户是否存在 查看有没有这个用户:id 名字 gid:用…

【数据可视化】Echarts官方文档及常用组件

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. Echarts官方文档介绍3. ECharts基础架构及常用术语3.1 ECharts的基础架构3.2 ECharts的常用术语3.2.1 ECharts的基本名词3.2.2 ECharts的图表名词 4. 直角坐标系下的网格及坐标轴4.1 直角坐标系下的网格4.2…

Linux——线程(4)

在上一篇博客中,我讲述了在多执行流并发访问共享资源的情况下,如何 使用互斥的方式来保证线程的安全性,并且介绍了Linux中的互斥使用的是 互斥锁来实现互斥功能,以及它的原理,在文章的结尾我提出了一个问题 用来引出同…

51单片机学习笔记6 数码管显示

51单片机学习笔记5 数码管显示 一、动态数码管1. 动态数码管工作原理2. 工作过程3. 原理图(1)数码管及74HC245(2)74HC138译码器 4. 74HC245介绍(1)**功能**(2)**引脚**(3…