MySQL8.0之前实现row_number以及计算玩家连续登录天数

news2025/6/10 4:48:21

使用MySQL 5.7版本统计 玩家连续登录天数

原始数据
在这里插入图片描述

玩家同一天多次登录只保留一条

select DISTINCT(FROM_UNIXTIME(login_time,'%Y-%m-%d')) as login_date,rid from t_log_login order by rid; 

在这里插入图片描述

借助两个变量统计每个玩家登录日期对应的次数

SELECT
*
FROM
	(
		SELECT DISTINCT FROM_UNIXTIME(login_time, '%Y-%m-%d') AS login_date,rid FROM t_log_login 
	) AS a,
(select @last_rid := '',@rn:=0) as b order by rid,login_date;

在这里插入图片描述
原始表多了两个表量,一个记录 当前循环的rid,一个记录rid出现的次数。
目前两个值都为初始值,现在对其进行调整

SELECT
	a.login_date,
	CASE
WHEN rid = @last_rid THEN
	@rn := @rn + 1
ELSE
	@rn := 1
END AS rnn,
 @last_rid := rid AS rid
FROM
	(
		SELECT DISTINCT
			FROM_UNIXTIME(login_time, '%Y-%m-%d') AS login_date,
			rid
		FROM
			t_log_login
	) AS a,
	(SELECT @last_rid := '' ,@rn := 0) AS b
ORDER BY
	rid,
	login_date;

我们只关注select 和from之前的字段部分,大概意思就是,如果rid等于设置的变量@last_rid ,rid对应的次数就加1,否则就等于1,然后再把rid的值赋值给 @last_rid 。可能这里不太懂,我们一步一步来看。

在这里插入图片描述
因此这里就体现了排序的重要性了。rid相同的必须连接在一起。

最终结果是:
在这里插入图片描述

使用日期函数date_add处理数据

上面的数据只能显示了每个玩家,某天对应的连续登录的第n次,中间断开的没有。比如

riddatern
123456782022-10-121
123456782022-10-132
123456782022-10-143
123456782022-10-164

那只能说rid=12345678 连续登录了3天。

那这种思路是什么呢,我们用当天日期减去对应的第n天,在这个列表里面也就是,2022-10-12 减去 1 天,也就是 2022-10-11 , 2022-10-13 号减去两天也是 2022-10-11 , 依次类推,因为 rn是顺序加1的,因此只要保证 日期也是顺序 加 1 的,就能说用户是连续登录了的。

因此思路:看 date - rn 对应日期 出现 的次数 就是 连续登录的天数了。就用group by就行了。

最终SQL:

select rid,count(*) as login_counts from(
  SELECT
	a.login_date,
	CASE
WHEN rid = @last_rid THEN
	@rn := @rn + 1
ELSE
	@rn := 1
END AS rnn,
 @last_rid := rid AS rid
FROM
	(
		SELECT DISTINCT
			FROM_UNIXTIME(login_time, '%Y-%m-%d') AS login_date,
			rid
		FROM
			t_log_login
	) AS a,
	(SELECT @last_rid := '' ,@rn := 0) AS b
ORDER BY
	rid,
	login_date
)as  d  group by rid,date_add(d.login_date,interval -@rn day) ;

在这里插入图片描述

思考

以上的sql可能出现表述不清楚的问题,如果是这种情况

riddatern
123456782022-10-121
123456782022-10-132
123456782022-10-143
123456782022-10-164
123456782022-10-175

那么 12345678 就会出现两行,因此要加上一个开始时间从哪天开始连续登录的。

select rid,  
date_add(d.login_date,interval -@rn day) as login_start_before,
count(*) as login_counts from(
  SELECT
	a.login_date,
	CASE
WHEN rid = @last_rid THEN
	@rn := @rn + 1
ELSE
	@rn := 1
END AS rnn,
 @last_rid := rid AS rid
FROM
	(
		SELECT DISTINCT
			FROM_UNIXTIME(login_time, '%Y-%m-%d') AS login_date,
			rid
		FROM
			t_log_login
	) AS a,
	(SELECT @last_rid := '' ,@rn := 0) AS b
ORDER BY
	rid,
	login_date
)as  d  group by rid,login_start_before ;

注意这里 开始时间需要在加上 一天,因为我们算的 日期 - 第n次出现,得到的是首次登录的前一天。这里就自己在外层加个日期转换就行了哦。

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

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

相关文章

云镜CVE-2022-25578复现

CVE-2022-25578复现漏洞信息漏洞复现读取flag🍉 shell来源:https://yunjing.ichunqiu.com/cve/detail/960?type1&pay2漏洞信息 漏洞名称taocms v3.0.2允许攻击者通过编辑.htaccess文件执行任意代码漏洞编号CVE-2022-25578危害等级超危漏洞类型任意…

day34|343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 36 解…

电子技术——共栅(共基)放大器

电子技术——共栅(共基)放大器 在本节我们学习IC中共栅(共基)放大器的配置,虽然我们之前在分立电路中学习过共栅(共基)放大器的配置。但是在IC中共栅(共基)放大器主要作为…

MES系统助力电子厂行业,打造高能效工厂

ES主要包括生产计划系统、工艺管理系统、质量管理系统、生产过程管理系统、设备管理系统、仓储管理系统及数据采集和统计分析系统等。实现生产过程可视化、可追溯。管理人员可以在管理界面对生产实时控制,从而根据需要精准调整生产,达到提高生产效率、缩…

算法与数据结构理解

目录1、数据结构与算法1.1 定义1.2 常见数据结构1.3 常用算法2、插入排序3、希尔排序4、归并排序1、数据结构与算法 1.1 定义 数据结构:是计算机中存储、组织数据的方式。具有一定逻辑关系,应用某种存储结构,并且封装了相应操作的数据元素集…

HTML浪漫动态表白代码+音乐(附源码)

HTML浪漫表白求爱(附源码)&#xff0c;内含4款浪漫的表白源码&#xff0c;可用于520&#xff0c;情人节&#xff0c;生日&#xff0c;求爱场景&#xff0c;下载直接使用。 直接上源码吧 一.红色爱心 1.效果 实际效果是动态的哦 2.源码 复制粘贴即可运行哦 <!DOCTYPE…

JVM 线程本地分配缓存TLAB

什么是TLAB 从内存模型而不是垃圾收集的角度&#xff0c;对 Eden 区域继续进行划分&#xff0c;JVM 为每个线程分配了一个私有缓存区域&#xff0c;它包含在 Eden 空间内 多线程同时分配内存时&#xff0c;使用 TLAB 可以避免一系列的非线程安全问题&#xff0c;同时还能提升…

一文读懂CXL协议

2001年&#xff0c;英特尔公布了第三代I/O技术——3GIO技术&#xff08;后更名为PCI Express&#xff0c;即PCIe&#xff09;&#xff0c;以高性能、高扩展性、高可靠性及出色的兼容性取代了包括AGP和PCI在内所有的内部总线并且不断升格。例如&#xff0c;2019年5月底公布的PCI…

JUC锁与AQS技术【我的Android开发技术】

JUC锁与AQS技术【我的Android开发技术】 AQS原理 AQS就是一个同步器&#xff0c;要做的事情就相当于一个锁&#xff0c;所以就会有两个动作&#xff1a;一个是获取&#xff0c;一个是释放。获取释放的时候该有一个东西来记住他是被用还是没被用&#xff0c;这个东西就是一个状…

六、Linux文件 - lseek函数

目录 1.lseek函数 2.lseek函数实战 2.1宏SEEK_CUR的用法 2.2宏SEEK_END的用法 3.Open函数实战 - O_APPEND的用法 4.Linux在库函数中寻找相应的宏定义 1.lseek函数 off_t lseek(int fd,off_t offset,int whence);光标的偏移量 fd:文件描述符offset:偏移量whence: SEEK_…

macOS中虚拟机桥接模式分配静态ip

1.首先使用dhclient命令&#xff0c;在局域网中分配一个C类地址。 2.获得地址后&#xff0c;输入ifconfig&#xff0c;查看分配的地址。 3.然后编辑vi /etc/sysconfig/network-scripts/ifcfg-en***文件 在该配置文件中编辑&#xff0c;设置ONBOOTyes&#xff0c;而后添加静态配…

分享5款安全无毒,下载简单的小软件

今天推荐一些安全无毒&#xff0c;下载简单&#xff0c;最重要的是没有广告的软件&#xff01; 1.文件备份传输——MultiPar MultiPar是一款奇偶校验文件工具&#xff08;Parchive tool&#xff09;&#xff0c;用来为文件、文件夹创建校验块&#xff0c;当文件损坏时&#xf…

客户端SDK测试是什么?如何测?(附真实项目经历)

客户端SDK测试是什么&#xff1f;如何测&#xff1f; 目录&#xff1a;导读 SDK是什么 测什么&#xff1f; 功能怎么测 接下来为大家讲述一番我的真实案例 1、做了些什么 2、做的方法 3、做得好的&#xff1a; 4、做得不好的&#xff1a; 5、个人成长&#xff1a; 6、…

产品设计方法论之基础

1、信息控件 输入框限制 输入文本的内容限制。常见的内容限制主要纯字母 (如英文有纯数字 (如手机号码)、名)、纯汉字(如中文名) &#xff0c;以及各种类型的排列组合或违禁内容的输入限制。如果用户输入限制的内容&#xff0c;我们可以按无法输入的逻辑处理&#xff0c;也可以…

LeetCode题解 动态规划(三):343 整数拆分;96 不同的二叉搜索树

343 整数拆分 medium 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 这道题乍一看没有点儿动态规划的影子&#xff0c;反而感觉用数学法可以求解。 但是…

后勤管理系统—服务台管理功能

数图互通是一家IT类技术型软件科技公司&#xff0c;专业的不动产、工作场所、空间、固定资产、设备家具、设施运维及可持续性管理解决方案软件供应商。 一、后勤管理系统服务台管理功能包含&#xff1a; 1、专业自动化、集中管理的自助服务助理&#xff0c;随时响应服务请求。…

作为公司,这个5款在线软件工具赶紧安利起来!

2023年了 &#xff0c;您的企业还没使用在线软件工具吗&#xff1f;自从用了在线工具之后&#xff0c;感觉打开了新办公世界的大门&#xff0c;效率蹭蹭蹭地往上涨啊。对于喜欢追求效率和便捷的我来说&#xff0c;在线实在是太棒了&#xff01;今天安利几个非常不错的在线软件工…

基于matlab使用神经网络清除海杂波

一、前言此示例演示如何使用深度学习工具箱™训练和评估卷积神经网络&#xff0c;以消除海上雷达 PPI 图像中的杂波返回。深度学习工具箱提供了一个框架&#xff0c;用于设计和实现具有算法、预训练模型和应用程序的深度神经网络。二、数据集该数据集包含 84 对合成雷达图像。每…

智能工厂自动化设备如何将数据采集到物联网云平台上

制造业工厂在进行生产管理、数字化转型升级的过程中&#xff0c;大量自动化设备的数据采集上云一直是困扰厂商的难题之一。因设备种类多、工艺复杂、设备老旧无多余通信接口导致数据无法集中、工艺无法实时管控&#xff0c;加上设备服务商的本地支持比较有限&#xff0c;因此设…

react-jwchat

react-jwchat: react-jwchat是一个基于React实现的web聊天组件。 如何阅读大型前端开源项目的源码 - 掘金 rollup专注以ESModule打包/自动treeshaking,更准确的来说rollup是小而美的打包工具 ts“typescript” ts是js类型的超集&#xff0c;被编译成纯js再执行 js&#xff…