sql题之使用划分会话的方式解决统计间隔连续登录问题

现有各用户的登录记录表(login_events)如下,表中每行数据表达的信息是一个用户何时登录了平台。

   

user_idlogin_datetime
1002021-12-01 19:00:00
1002021-12-01 19:30:00
1002021-12-02 21:01:00

现要求统计各用户最长的连续登录天数,间断一天也算作连续,例如:一个用户在1,3,5,6登录,则视为连续6天登录。期望结果如下:

user_id
<int>
(用户id)
max_day_count
<int>
(最大连续天数)
1003
1016
1023
1043
1051

话不多说,某位大佬写的SQL我感觉挺牛的,然后我就把它的SQL拿过来。

   对于七天内连续三天登录,断一天也算这种的SQL题,基本上就是需要使用到lead,lag函数,

  以及使用日期减去排名之类的做法。

   一位大佬给出了划分会话的形式来解决七天内连续三天的问题。并且使用拼接concat的方式。

我认为做的确实不错,值得借鉴。

  题解
-- 1.对日期进行格式化,并且进行去重
WITH tmp as( --没啥好说的,做一个数据格式化,同时去重SELECTuser_id,date_format(login_datetime,"yyyy-MM-dd") login_datefrom login_eventsgroup by user_id,date_format(login_datetime,"yyyy-MM-dd") )
   --2.取出登录日期的上一个日期

  

 SELECTuser_id,login_date,--1.注解从这里看起,取出用户上一次登录的日期lag(login_date,1,'1970-01-01') over(PARTITION by user_id order by login_date) last_login

--3.计算登陆日期和上一次登录日期的差值,根据差值打标记
user_id,login_date,last_login,--2.进行判断,今天登录的日期减去上一次登录的日期,如果大于2的话,就是一个会话的新起点,给这个新起点标记一个1,后面开窗聚合,范围为上无边界到当前行,同一个会话sum的值就会相同IF(datediff(login_date,last_login)>2,1,0) flag
-- 4.按照用户分区日期排序,划分会话

     

user_id,login_date,	--3.这里拼上一个user_id的目的是给每一个会话建立一个唯一标识,方便后面按照会话的唯一标识进行group byconcat(user_id,"-",sum(flag) over(PARTITION by user_id order by login_date )) flagax_day_count
--5.按照用户,会话分组,求组内最大日期和最小日期的登录差值。

   

user_id,--4.这就是每一条子sql都保留login_date这个字段的意义,同一个会话内的最大日期减去最小日期得到的就是连续登录的天数datediff(max(login_date),min(login_date)) + 1 max_day_count
group by user_id,flag
5.最终SQL
WITH tmp as( --没啥好说的,做一个数据格式化,同时去重SELECTuser_id,date_format(login_datetime,"yyyy-MM-dd") login_datefrom login_eventsgroup by user_id,date_format(login_datetime,"yyyy-MM-dd") )SELECTuser_id,--4.这就是每一条子sql都保留login_date这个字段的意义,同一个会话内的最大日期减去最小日期得到的就是连续登录的天数datediff(max(login_date),min(login_date)) + 1 max_day_countfrom(SELECTuser_id,login_date,	--3.这里拼上一个user_id的目的是给每一个会话建立一个唯一标识,方便后面按照会话的唯一标识进行group byconcat(user_id,"-",sum(flag) over(PARTITION by user_id order by login_date )) flagfrom(SELECTuser_id,login_date,last_login,--2.进行判断,今天登录的日期减去上一次登录的日期,如果大于2的话,就是一个会话的新起点,给这个新起点标记一个1,后面开窗聚合,范围为上无边界到当前行,同一个会话sum的值就会相同IF(datediff(login_date,last_login)>2,1,0) flagfrom(SELECTuser_id,login_date,--1.注解从这里看起,取出用户上一次登录的日期lag(login_date,1,'1970-01-01') over(PARTITION by user_id order by login_date) last_loginfrom tmp)t1)t2)t3 group by user_id,flag

在这个sql里面,我们既需要使用lag,lead函数获取日期的上一行下一行,也需要对日期差值打标记,同时使用concat划分会话,然后使用sum函数。之后需要求最大值与最小值差值

   

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

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

相关文章

嵌入式学习第十五天!(内存管理、链表)

1. 内存管理&#xff1a; 1. malloc void *malloc(size_t size); 功能&#xff1a;申请堆区空间 参数&#xff1a;size&#xff1a;申请堆区空间的大小 返回值&#xff1a;返回获得的空间的首地址&#xff0c;失败返回NULL 2. free void free(void *ptr); 功能&#xff1a;释…

volatile 关键字的用法说明

volatile字面翻译为不稳定的&#xff0c;易变的。 一般编译器优化时&#xff0c;如果一个数据已经读取进寄存器&#xff0c;后续会优先从寄存器中取值来减少访问存储时间&#xff0c;但如果此数值会随时变动&#xff0c;结果就会出现错误 以下测试 #include <stdio.h> i…

信效度检验2(SPSS

目录 1.效度介绍&#xff1a;2.效度检验&#xff1a;小结&#xff1a; 1.效度介绍&#xff1a; 用于研究题项设计是否合适 2.效度检验&#xff1a; 点击 降维->因子 把涉及到因变量的问题放入即可&#xff1a; 勾选&#xff1a; 得到输出结果&#xff1a; KMO值 0.7…

C语言实战三:图书管理系统

这个图书管理系统包括了添加、查找、删除、编辑、显示和保存书籍信息的功能。书籍信息被保存在一个文本文件中&#xff0c;在程序启动时从文件中加载&#xff0c;退出程序时保存到文件中。用户可以通过命令行界面操作图书管理系统&#xff0c;并进行相应的功能操作。 一、代码…

pg数据库替换指定ip

pg数据库替换指定ip 配菜单是部署机ip发生变化&#xff0c;记录一下处理方法,先根据源ip查询出主键id&#xff0c;在将源ip替换成目标ip updatesys_menu sethref replace(href, 10.116.63.4, 10.116.58.23) whereid in(select*fromsys_menuwherehref like %10.116.58.23% )

信息学奥赛一本通1931:【05NOIP普及组】校门外的树

1931&#xff1a;【05NOIP普及组】校门外的树 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 9210 通过数: 6928 【题目描述】 某校大门外长度为L的马路上有一排树&#xff0c;每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴&#xff0c;马路的一…

24校招,快手测试开发工程师二面

前言 大家好&#xff0c;我是chowley&#xff0c;今天回顾一下&#xff0c;之前参加快手的校招面试 全程没有测试方向问题&#xff0c;一直拷打编程语言特性和数据底层结构 时间&#xff1a;50min 平台&#xff1a;轻雀&#xff08;请勿切屏&#xff09; 过程 自我介绍用…

如何使用wireshark解析二进制文件

目录 目录 1.将已有的packet raw data按照下面格式写入文本文件中 a. Raw IP packet b. Ethernet packet 2.用wiershark导入hex文件 3.设置对应的packet类型 a. Raw IP packet b. Ethernet packet 1.将已有的packet raw data按照下面格式写入文本文件中 a. Raw IP pac…

汽车燃油泵数据分析:全球市场的年复合增长率将达到10%左右

燃油泵是汽车配件行业的专业术语。是电喷汽车燃油喷射系统的基本组成之一&#xff0c;位于车辆油箱内部&#xff0c;燃油泵在启动和发动机运转时工作&#xff0c;如果发动机停止而点火开关仍处于ON时&#xff0c;HFM-SFI控制模块关闭燃油泵的电源&#xff0c;以避免意外点火。 …

OpenCV与机器学习:使用opencv实现KNN

使用opencv实现KNN 前言OpenCV实现KNN生成随机数据使用matplotlib绘制数据OpenCV用于KNN训练生成新数据并观察预测 前言 KNN算法&#xff0c;即K-Nearest Neighbor&#xff0c;是一种简单的机器学习算法。它的基本思想是&#xff1a;如果一个样本在特征空间中的K个最相似&…

标注数据集 --labelimg

前言&#xff1a;我们想要训练自己的数据集时&#xff0c;通常需要自己标注数据集。无论是标注成yolo可识别的txt格式还是voc数据集的xml格式。使用labelimg标注都是一个不错的选择。 下面我们就从创建环境&#xff0c;使用labelimg进行标注两个方面来说明。 1.创建labelimg环境…

ADI 配合 USRP 使用的相控阵天线 cn0566

相控阵天线 在这里插入图片描述

Python实战:爬取微博,获取南京地铁每日客流数据

在这篇文章中&#xff0c;我们将使用 Python 进行网络爬虫&#xff0c;爬取微博上的南京地铁每日客流数据。 一、分析网页 在“南京地铁”微博主页搜索“昨日客流”关键词&#xff0c;搜索到每天发布的昨日客流数据。 “南京地铁”微博主页地址https://weibo.com/u/26382762…

基于视觉的移载协作机器人机床上下料末端纠偏算法

摘 要 针对复合机器人在机床上下料中的定位方法,本文主要关注识别机床卡盘和末端作业面的定位。首先分 析了复合机器人在机床上下料过程中的工作原理及其基本结构,包括 AGV (自动导引车)和协作机器人 的功能及特点。然后,详细阐述了如何使用视觉系统和纠偏算法来…

京东采销急眼,隔空喊话“针对”拼多多,焦虑之下为哪般?

农历新年将至&#xff0c;无论是线下各大商超还是线上电商平台&#xff0c;皆为年终大促而“忙的不亦乐乎”&#xff0c;尤其是近期发生的京东采销人员在直播间向拼多多喊话&#xff0c;“恳请拼多多停止屏蔽&#xff0c;恳请拼多多直接比价”&#xff0c;更是将年底这场朴实无…

flink cdc,standalone模式下,任务运行一段时间taskmanager挂掉

在使用flink cdc&#xff0c;配置任务运行&#xff0c;过了几天后&#xff0c;任务无故取消&#xff0c;超时&#xff0c;导致taskmanager挂掉&#xff0c;相关异常如下&#xff1a; 异常1&#xff1a; did not react to cancelling signal interrupting; it is stuck for 30 s…

ElasticSearch基础用法

什么是ElasticSearch? Elasticsearch是一个开源的、分布式的、实时的搜索和分析引擎。它允许用户近乎实时地存储、检索大量数据&#xff0c;并能够高效地对其进行全文搜索、聚合和分析。 部署ES和Kibana 通常采用docker-compose部署ES&#xff08;ElasticSearch&#xff09;服…

react-jss书写样式 与 react-intl 国际化的使用 与 classnames 动态css的使用

目录 react-jss的使用react-intl 国际化的使用App.tsxIntlProvider 配置ConfigProvider组件/router/indexlocaleslocales / zh.json || en.json 组件中使用 国际化 classnames 动态css的使用 react-jss的使用 实现组件化样式、动态样式、避免样式冲突 npm install react-jss …

React 组件中怎么做事件代理

在 React 组件中使用事件代理可以使用以下方法&#xff1a; 使用 on 方法来绑定事件监听器&#xff1a; class MyComponent extends React.Component {handleClick(event) {if (event.target.tagName BUTTON) {console.log(Button clicked);}}render() {return (<div onC…

如何写好论文——(3)研究选题的三种途径

一、填补研究空白——创新 在前人的研究基础上发现问题、提出创新&#xff0c;在技术上具有挑战性 关键&#xff1a;提出我们在课题上创新的部分&#xff0c;它可能是新的解决方案&#xff0c;从其他领域借鉴过来的新的想法 因为它是老问题&#xff0c;所以需要研究前人已经…