mysql 5.7实现组内排序(连续xx天数)

需求:查询出连续登录的用户及其连续登录的天数

我先说一下思路:要实现连续登录的判断,可以找一下他们之间的规律。这里我拿一个用户来说,如果这个用户在1、2、3号都有登录记录,可以对这个用户的数据按照时间排序,然后按照顺序加一个索引,如下图
在这里插入图片描述
到这可能有一些人已经看规律来了。规律如下图
在这里插入图片描述
所以当日期-序号得到的值相同说明是连续的,反之则是不连续的。

背景

最近项目上有连续预警次数的统计这种需求,用的是mysql5.7版本,在mysql8.0版本中实现分组排序可以用row_number() over(partition by 分组字段 order by 排序字段)就可以了,但是在mysql5.7是没有该方法的,只能自己实现了。

方案

首先我们先建一个表,这个表里只有几个所用的字段,主要就是日期和得分。

CREATE TABLE `a_test` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '标识',`stat_cycle` varchar(255) DEFAULT NULL COMMENT '日期',`user_no` varchar(255) DEFAULT NULL COMMENT '用户编号',`score` varchar(255) DEFAULT NULL COMMENT '得分',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试表';

然后随便插入一些数据

INSERT INTO `a_test` VALUES ('1', '20240901', '1', '80');
INSERT INTO `a_test` VALUES ('11', '20240901', '2', '75');
INSERT INTO `a_test` VALUES ('21', '20240901', '3', '90');
INSERT INTO `a_test` VALUES ('31', '20240902', '1', '98');
INSERT INTO `a_test` VALUES ('41', '20240902', '2', '92');
INSERT INTO `a_test` VALUES ('51', '20240903', '1', '88');
INSERT INTO `a_test` VALUES ('61', '20240910', '1', '96');
INSERT INTO `a_test` VALUES ('71', '20240910', '2', '92');
INSERT INTO `a_test` VALUES ('81', '20240911', '1', '88');
INSERT INTO `a_test` VALUES ('91', '20240911', '2', '100');

查询看一下数据

select * from a_test

在这里插入图片描述
在mysql5.7中加索引可以通过变量来控制

select 
@row_number :=IF(@user_no = a.user_no, @row_number + 1, 1 ) AS rn,
@user_no := a.user_no AS user_no,
a.score,
a.stat_cycle
from a_test a,
(select @row_number := 0) b
where date_format(a.stat_cycle,'%Y%m') = '202409'
ORDER BY a.user_no,a.stat_cycle asc

在这个sql里,(select @row_number := 0) b就相当于创建了一个变量row_number,默认值为0,而在上边查询条件里通过IF判断对变量row_number重新赋值:如果变量user_no与记录的user_no相等则row_number +1,反之重新赋值为1
@user_no同理

结果为:
在这里插入图片描述

注意

第一点

下边这两个变量顺序不能反,不然的话,rn就不是组内进行排序了

@row_number :=IF(@user_no = a.user_no, @row_number + 1, 1 ) AS rn,
@user_no := a.user_no AS user_no

结果是这样的(注意看rn列)
在这里插入图片描述

第二点

如果是同统计连续登录这个问题可忽略。

第二个问题也我在项目发布测试才发现的:如果数据不是顺序插入(我项目是有个导入的功能,客户填写的时候可能第一行日期是25号,第二行是24号)。

首先,我们先新建一个b_test表

CREATE TABLE `b_test` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '唯一标识',`user_no` varchar(32) DEFAULT NULL COMMENT '编号',`user_name` varchar(255) DEFAULT NULL COMMENT '名称',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入b_test表数据

INSERT INTO `b_test` VALUES ('1', '1', '张三');
INSERT INTO `b_test` VALUES ('2', '2', '李四');
INSERT INTO `b_test` VALUES ('11', '3', '王五');

查看下b_test表数据

SELECT * from b_test

结果如下
在这里插入图片描述

修改a_test表数据:模拟用户导入,先插入了2号的数据,再插入1号的数据,这里注意下id(自增类型主键),20240902是主键为1,20240901主键为31。然后我还关联了一个基本信息表b_test
在这里插入图片描述

这是原始sql

select 
@row_number :=IF(@user_no = a.user_no, @row_number + 1, 1 ) AS rn,
@user_no := a.user_no AS user_no,
a.score,
a.stat_cycle
-- ,b.user_name
from a_test a 
-- left join b_test b on a.user_no=b.user_no
,
(select @row_number := 0) b
where date_format(a.stat_cycle,'%Y%m') = '202409'
ORDER BY a.user_no,a.stat_cycle asc

结果为
在这里插入图片描述
看user_no为1的排序,20240901序号为1,20240902序号为2,没有问题
接着关联查出user_name。

select 
@row_number :=IF(@user_no = a.user_no, @row_number + 1, 1 ) AS rn,
@user_no := a.user_no AS user_no,
a.score,
a.stat_cycle
,b.user_name
from a_test a left join b_test b on a.user_no=b.user_no
,
(select @row_number := 0) b
where date_format(a.stat_cycle,'%Y%m') = '202409'
ORDER BY a.user_no,a.stat_cycle asc

结果为:
在这里插入图片描述
数据就不一样了:20240901排序序号变成了2,20240902序号为1

针对上述sql,我有两个问题,希望有大佬帮忙解答
*
(1)按照sql执行顺序来说,先select,在order by,所以是关联,然后赋值序号,然后再根据日期排序。在执行到select这一步时,表里的数据是20240902在前,20240901在后,所以排上序后,20240902对应着1,20240901对应着2,排完序后会出现这个结果。但是咱们不关联b_test的表的时候,也应该是这个sql顺序,但是查询结果却是20240901对应着1,20240902对应着2,和刚才说的逻辑就冲突了
(2)先看不关联的sql的话,像是先执行的排序,然后赋值序号,先不说违背了sql执行顺序,关联的b_test表的sql结果也说不过去*

在这里插入图片描述

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

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

相关文章

J3学习打卡

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 DensNet模型 import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.keras import layers, models, initializersclass DenseLayer(lay…

基于微信小程序的小区管理系统设计与实现(lw+演示+源码+运行)

摘 要 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,处理信息不再受制于地理位置的限制,处理信息及时高效,备受人们的喜爱。所以各大互联网厂商都瞄准移动互联网这个潮…

随机变量、取值、样本和统计量之间的关系

1. 随机变量 (Random Variable) 随机变量是用来量化随机现象结果的一种数学工具。随机变量是一个函数,它将实验结果映射到数值。随机变量可以是离散的或连续的。 离散随机变量:取有限或可数无限个值。例如,掷骰子的结果。连续随机变量&…

Matlab实现蚁群算法求解旅行商优化问题(TSP)(理论+例子+程序)

一、蚁群算法 蚁群算法由意大利学者Dorigo M等根据自然界蚂蚁觅食行为提岀。蚂蚁觅食行为表示大量蚂蚁组成的群体构成一个信息正反馈机制,在同一时间内路径越短蚂蚁分泌的信息就越多,蚂蚁选择该路径的概率就更大。 蚁群算法的思想来源于自然界蚂蚁觅食&a…

给哔哩哔哩bilibili电脑版做个手机遥控器

前言 bilibili电脑版可以在电脑屏幕上观看bilibili视频。然而,电脑版的bilibili不能通过手机控制视频翻页和调节音量,这意味着观看视频时需要一直坐在电脑旁边。那么,有没有办法制作一个手机遥控器来控制bilibili电脑版呢? 首先…

JavaEE初阶---网络原理之TCP篇(二)

文章目录 1.断开连接--四次挥手1.1 TCP状态1.2四次挥手的过程1.3time_wait等待1.4三次四次的总结 2.前段时间总结3.滑动窗口---传输效率机制3.1原理分析3.2丢包的处理3.3快速重传 4.流量控制---接收方安全机制4.1流量控制思路4.2剩余空间大小4.3探测包的机制 5.拥塞控制---考虑…

【C语言刷力扣】3216.交换后字典序最小的字符串

题目: 解题思路: 字典序最小的字符串:是指按照字母表顺序排列最前的字符串。即字符串在更靠前的位置出现比原字符串对应字符在字母表更早出现的字符。 枚举数组元素,尽早将较小的同奇偶的相邻字符交换。 char* getSmallestString…

Java:Map和Set练习

目录 查找字母出现的次数 只出现一次的数字 坏键盘打字 查找字母出现的次数 这道题的思路在后面的题目过程中能用到,所以先把这题给写出来 题目要求:给出一个字符串数组,要求输出结果为其中每个字符串及其出现次数。 思路:我…

【宠粉赠书】大模型项目实战:多领域智能应用开发

在当今的人工智能与自然语言处理领域,大型语言模型(LLM)凭借其强大的生成与理解能力,正在广泛应用于多个实际场景中。《大模型项目实战:多领域智能应用开发》为大家提供了全面的应用技巧和案例,帮助开发者深…

【商汤科技-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

Nginx防盗链配置

1. 什么是盗链? 盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供…

Oracle+11g+笔记(8)-备份与恢复机制

Oracle11g笔记(8)-备份与恢复机制 8、备份与恢复机制 8.1 备份与恢复的方法 数据库的备份是对数据库信息的一种操作系统备份。这些信息可能是数据库的物理结构文件,也可能是某一部分数 据。在数据库正常运行时,就应该考虑到数据库可能出现故障&#…

基于Multisim的篮球比赛电子记分牌设计与仿真

一、设计任务与要求 设计一个符合篮球比赛规则的记分系统。 (1)有得1分、2分和3分的情况,电路要具有加、减分及显示的功能。 (2)有倒计时时钟显示,在“暂停时间到”和“比赛时间到”时,发出声光…

易友BOM管理软件

易友BOM管理软件介绍 易友BOM管理软件是一款功能齐全、操作简便、安全可靠的BOM管理系统。它为企业提供了多方面的BOM管理解决方案,帮助企业提高生产效率、降低成本、增强灵活性并提升竞争力。制造企业,都可以通过易友BOM管理软件来实现BOM管理的优化和…

【模型学习之路】手写+分析bert

手写分析bert 目录 前言 架构 embeddings Bertmodel 预训练任务 MLM NSP Bert 后话 netron可视化 code2flow可视化 fine tuning 前言 Attention is all you need! 读本文前,建议至少看懂【模型学习之路】手写分析Transformer-CSDN博客。 毕竟Bert是tr…

不用求人,4个方法快速恢复小米手机删除短信

手机短信作为我们日常办理事情的重要验收通道,往往承载着许多重要的信息。然而,由于各种原因,我们可能会不小心删除了重要的短信。那么,小米手机用户如何恢复这些被删除的短信呢?接下来,我们将分点为您详细…

爆肝整理14天AI工具宝藏合集(三)

🛠️以下是我为大家整理的AI工具宝藏合集(三): 💡AI搜索 1️⃣ 天工AI搜索 2️⃣ 秘塔AI搜索 3️⃣ 夸克AI搜索 4️⃣ 开搜AI搜索 💡 AI视频 1️⃣ 可灵AI 2️⃣ 即梦AI 3️⃣ Vidu 4️⃣ Stable Video …

vue版本太低无法执行vue ui命令

连接 ui和create目前都只支持3.0以后得版本才能使用 https://blog.csdn.net/m0_67318913/article/details/136775252?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-136775252-blog-121204604.235v43pc_blog_bottom_relevance…

ETL集成工具丨如何运用ETLCloud单步调试断点功能

在现代数据处理领域,ETLCloud 的单步调试断点功能正成为数据管理的重要工具。ETLCloud 是一个强大的云端数据处理平台,它提供了灵活的单步调试功能,使得用户能够逐步跟踪和分析数据处理流程。本文将探讨如何运用 ETLCloud 的单步调试断点功能…

python 模块和包、类和对象

模块 模块是包含 Python 代码的文件,通常用于组织相关的函数、类和其他语句。模块可以被导入并在其他 Python 文件中使用。 创建模块 假设你创建了一个名为 mymodule.py 的文件,内容如下: # mymodule.pydef greet(name): return f"…