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结果也说不过去*

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT 从ttf文件中读取图标

最近在做项目时,遇到需要显示一些特殊字符的需求,这些特殊字符无法从键盘敲出来,于是乎,发现可以从字体库文件ttf中读取显示。 参考博客:QT 图标字体类IconHelper封装支持Font Awesome 5-CSDN博客 该博客封装的很不错…

【Python字符串操作】常用方法和高级技巧

包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】领取! Python作为一种强大的编程语言,在处理文本数据方面提供了丰富而灵活的工具。字符串是Python中最常用的数据类型之一,掌握字符串操作不仅能提高代码效率&…

深度学习系列——RNN/LSTM/GRU,seq2seq/attention机制

1、RNN/LSTM/GRU可参考: https://zhuanlan.zhihu.com/p/636756912 (1)对于这里面RNN的表示中,使用了输入x和h的拼接描述,其他公式中也是如此 (2)各符号图含义如下 2、关于RNN细节,…

VMware虚拟机启动报错“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”

之前正常使用的VMware虚拟机,突然启动时报错:此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态,详细信息如下截图所示。   百度错误信息,根据参考文献1中的方案,进入BIOS设置启动VT-x。进入BIOS后&…

顺序表-数组逆置

今天开始进入算法环节,从头开始手撸各种算法,这里使用C语言,后续我会补充Java版的。 大家都知道顺序表是一个线性表,那么他就具有线性表的特性,那就是随机存取,它的逻辑地址跟物理地址都是相同的&#xff…

一个简单的 uas_send_bye.xml for SIPp

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE scenario SYSTEM "sipp.dtd"> <scenario name"iinv-o200-obye.xml -- wjd 2014"><recv request"INVITE" rrs"true"/><send>&l…

单片机串口和电脑串口连接

单片机串口和电脑串口连接&#xff1a; 先将MCU的TTL电平转换为RS232电平&#xff0c;才可以和电脑的串口DB9相连接。见下图所示&#xff1a; 翻看自己以前记录的笔记&#xff0c;真是初级到极点了。

Java Lock Semaphore 总结

前言 相关系列 《Java & Lock & 目录》&#xff08;持续更新&#xff09;《Java & Lock & Semaphore & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Java & Lock & Semaphore & 总结》&#xff08;学习总结/最新最准…

文案语音图片视频管理分析系统-视频矩阵

文案语音图片视频管理分析系统-视频矩阵 1.产品介绍 产品介绍方案 产品名称&#xff1a; 智驭视频矩阵深度分析系统&#xff08;SmartVMatrix&#xff09; 主要功能&#xff1a; 深度学习驱动的视频内容分析多源视频整合与智能分类高效视频检索与编辑实时视频监控与异常预警…

C#判断点是否在多边形内

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff01;人工智能学习网站 前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任…

【SQL Server】解决因使用 varchar 类型存储 Unicode 字符串导致的中文显示乱码问题

问题描述 导入 SQL 到 SQL Server 数据库后&#xff0c;存在部分列的中文显示异常的问题。 原因分析 观察发现显示异常的字段的数据类型是 varchar&#xff0c;而显示正常的字段的数据类型是 nvarchar。 而且&#xff0c;SQL 文件中所有字符串前面都带有 N 的前缀。 在 SQL 中…

su user更换用户后无法打开图形屏幕Cannot open your terminal ‘/dev/pts/0‘ 解决办法

我在docker内使用了su john更换了用户&#xff0c;执行petalinux-config -c kernel时打不开图形屏幕窗口&#xff0c;需要执行命令script /dev/null 进入docker和配置状态的所有命令行命令如下&#xff1a; johnjohn-hp:~/zynq$ ./docker_ubuntu16.sh rootjohn-hp:/home/john/…

【永中软件-注册/登录安全分析报告】

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

Oracle自动处理表空间不足脚本

关注过我的朋友们应该知道我分享过一些常用的监控脚本&#xff0c;其中最常用的就是监控表空间使用率的脚本&#xff0c;具体可以参考如下链接​&#xff1b; oracle常用监控脚本&#xff08;纯干货&#xff0c;没有EMCC,ZABBIX也不怕&#xff09;_oracle 监控及日常处理脚本-…

如何用示波器测实时时钟信号和主时钟信号

使用示波器测量实时时钟信号&#xff08;RTC&#xff09;和主时钟信号&#xff08;Main Clock Signal&#xff09;的步骤如下&#xff1a; 1. 准备工作 选择合适的探头&#xff1a;使用高品质的示波器探头&#xff0c;通常10X衰减探头适合大部分情况。校准探头&#xff1a;确…

NVR设备ONVIF接入平台EasyCVR视频融合平台智慧小区视频监控系统建设方案

一、方案背景 智慧小区构成了“平安城市”建设的基石。随着社会的进步&#xff0c;社区安全问题逐渐成为公众关注的热点。诸如高空抛物、乱丢垃圾、破坏车辆、入室盗窃等不文明行为和违法行为频繁出现。目前&#xff0c;许多小区的物业管理和安全防护系统仍然较为简单和陈旧&a…

数据分析-38-关于互联网企业黑名单的探索

论文辅导或算法学习可以滴滴我 文章目录 项目介绍表和字典描述1、读取数据2、查看黑名单公司主要来自哪些城市3、查看黑榜公司分布城市4、存在的问题5、查看存在问题分类 项目介绍 在数字化的时代&#xff0c;信息的力量不言而喻&#xff0c;尤其当我们面临职业选择时。是一个…

论文略读:Can We Edit Factual Knowledge by In-Context Learning?

EMNLP 2023 第一个探索in-context learning在语言模型知识编辑方便的效果 传统的知识编辑方法通过在包含特定知识的文本上进行微调来改进 LLMs 随着模型规模的增加&#xff0c;这些基于梯度的方法会带来巨大的计算成本->论文提出了上下文知识编辑&#xff08;IKE&#xff0…

鼠标事件与webGl坐标系

弯道超车&#xff1a; 盒子模型&#xff1a; 又称CSS 盒模型&#xff0c;包含content、padding、border 和 margin 四个部分。 clientWidth、scrollWidth、offsetWidth之间的区别&#xff1a; offsetWidth&#xff1a;包含内容、padding、border 和滚动条的宽度&#xff08;如果…

Camp4-L0:Linux 前置基础

书生浦语大模型实战营Camp4-L0:Linux前置基础 教程地址&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/linux任务地址&#xff1a;https://github.com/InternLM/Tutorial/blob/camp4/docs/L0/linux/task.md 任务描述完成所需时间闯关任务完成SSH连接与…