Mysql 连续时间分组

该方案不限于本例的连续时间,还可以应用于其他连续组。

[En]

The scheme is not limited to the continuous time of this example, but can also be applied to other consecutive groups.

连续条件 分组这问题困扰了很久,之前觉得在SQL上很难处理,都是在程序上做处理。后面实在有太多这需求了,所以只能想办法在SQL上处理了。

如下是处理的过程:

思路是使用变量 逐行将上行和当前行进行对比 条件满足则生成分组的编号,再根据分组条件和分组编号分组就可以;

原数据:

;gutter:true;
SELECT P_PmsCode,P_CreatorUserName,P_CreatorTime,P_ClockinDate
FROM
pm_attendancerecord WHERE P_PmsCode!='0' ORDER BY P_PmsCode,P_CreatorUserName,P_CreatorTime</p> <pre><code> ![Mysql 连续时间分组](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/607568-20220429090955372-1621578079.png) 首先按条件和时间对查询进行排序,将前一行的数据相加,比对后得到连续的数据。<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>First, sort the query according to the conditions and time to be grouped and add the data of the previous row to get continuous data after comparison.</font>*</details> ;gutter:true;
SELECT P_PmsCode,P_CreatorUserName,P_CreatorTime,P_ClockinDate
,@RPMS := @RPMS as pms1, @RPMS := P_PmsCode as pms2
,@RNAME := @RNAME as mane1, @RNAME := P_CreatorUserName as mane2
,@Rdate := @Rdate as date1, @Rdate := P_ClockinDate as date2
FROM pm_attendancerecord ,(SELECT @RPMS := 0) as a,(SELECT @RNAME := 0) as b,(SELECT @Rdate := ‘2001-01-01′) as c
WHERE P_PmsCode!=’0’
ORDER BY P_PmsCode,P_CreatorUserName,P_CreatorTime

Mysql 连续时间分组

第二,条件比较生成块编码。

[En]

Second, condition comparison generates block coding.

;gutter:true;
select t1.*,
IF((pms1=pms2 and mane1=mane2 and (date1=date2 or DATE_ADD(date1,INTERVAL 1 DAY)= date2)),(@Gid := @Gid),(@Gid:=UUID())) as groupid
from (
SELECT P_PmsCode,P_CreatorUserName,P_CreatorTime,P_ClockinDate
,@RPMS := @RPMS as pms1, @RPMS := P_PmsCode as pms2
,@RNAME := @RNAME as mane1, @RNAME := P_CreatorUserName as mane2
,@Rdate := @Rdate as date1, @Rdate := P_ClockinDate as date2
FROM
pm_attendancerecord ,(SELECT @RPMS := 0) as a,(SELECT @RNAME := 0) as b,(SELECT @Rdate := '2001-01-01') as c WHERE P_PmsCode!='0' ORDER BY P_PmsCode,P_CreatorUserName,P_CreatorTime</p> <pre><code> ) as t1, (SELECT @Gid := UUID()) as t2 </code></pre> <pre><code> ![Mysql 连续时间分组](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/607568-20220429095200754-985208834.png) 三:根据上面的结果 再进行分组就可能实现 ;gutter:true;
select P_PmsCode,P_CreatorUserName,MIN(P_ClockinDate) as P_MinDate, MAX(P_ClockinDate) as P_MaxDate
from (
select t1.*,
IF((pms1=pms2 and mane1=mane2 and (date1=date2 or DATE_ADD(date1,INTERVAL 1 DAY)= date2)),
(@Gid := @Gid),(@Gid:=UUID())
) as groupid
from (
SELECT P_PmsCode,P_CreatorUserName,P_CreatorTime,P_ClockinDate
,@RPMS := @RPMS as pms1, @RPMS := P_PmsCode as pms2
,@RNAME := @RNAME as mane1, @RNAME := P_CreatorUserName as mane2
,@Rdate := @Rdate as date1, @Rdate := P_ClockinDate as date2
FROM pm_attendancerecord ,(SELECT @RPMS := 0) as a,(SELECT @RNAME := 0) as b,(SELECT @Rdate := ‘2001-01-01′) as c
WHERE P_PmsCode!=’0’
ORDER BY P_PmsCode,P_CreatorUserName,P_CreatorTime

) as t1, (SELECT @Gid := UUID()) as t2
) t3 GROUP BY P_PmsCode,P_CreatorUserName,groupid;

Mysql 连续时间分组

连续时间分组在上面完成。

[En]

The continuous time grouping is completed above.

后续说明:

原是想创建为视图的,但mysql 不支持有参数 只能通过函数或存储过程或新建表来处理;

以上为本人原创:

Original: https://www.cnblogs.com/yan8shi/p/16205620.html
Author: 黄衍仕
Title: Mysql 连续时间分组

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505442/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux–>shell

    shell是什么 Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序。 用户可以用Shell来启动,挂起,停止,编写一些程序。 S…

    数据库 2023年6月14日
    0187
  • Linux网络配置

    Linux网络配置 NAT网络配置 查看网络IP和网关 可以在 编辑->虚拟网络编辑器中 查看网络IP和网关 说明:1.什么是IP协议/地址?即”网络之间能相互连…

    数据库 2023年6月16日
    0142
  • 10、比较Bigdecimal类型是否相等的方法

    一、Bigdecimal.equals()详解: Bigdecimal的equals方法不仅仅比较值的大小是否相等,首先比较的是scale(scale是bigdecimal的保留小…

    数据库 2023年6月6日
    0151
  • Java的try-resource

    原来是这个,这个是之前的try catch,包括最后进行关流等操作。 private String getBodyString(final ServletRequest reque…

    数据库 2023年6月11日
    0112
  • 计算机网络基础

    计算机网络基础 计算机网络的定义和功能 计算机网络是利用通信设备和线路,将分布在地理位置不同的、功能独立的多个计算机系统连接起来,以功能完善的网络软件(网络通信协议及网络操作系统等…

    数据库 2023年6月16日
    0132
  • 一个校验接口引发的思考–我真的了解Response吗

    一个校验接口 最近,我需要对接一个外部接口,基本功能是:校验指定的门店是否完善了货运信息。接口大致是这样的: POST https://******/Dealer/CheckCar…

    数据库 2023年6月6日
    0150
  • MySQL之SQL语句优化

    即优化器利用自身的优化器来对我们写的SQL进行优化,然后再将其放入InnoDB引擎中执行。 移除不必要的括号 select * from x where ((a = 5)); 上面…

    数据库 2023年5月24日
    0136
  • 详解在Linux中安装配置MongoDB

    最近在整理自己私人服务器上的各种阿猫阿狗,正好就顺手详细记录一下清理之后重装的步骤,今天先写点数据库的内容,关于在 Linux中安装配置 MongoDB 说实话为什么会装 Mong…

    数据库 2023年6月11日
    0215
  • Linux–>进程管理

    基本介绍 在Linux中, 每个执行程序都称为一个进程。每一个进程都会分配一个ID号(pid,进程号) 每个进程都可能以俩种方式存在的。分别是 前台与 后台,所谓前台进程就是用户目…

    数据库 2023年6月14日
    0162
  • 多态:向上转型和向下转型

    1)本质:父类的引用指向了子类的对象 2)语法:父类类型 引用名 = new 子类类型(); 3)特点:编译类型看左边,运行类型看右边。 可以调用父类中的所有成员(需遵守访问权限)…

    数据库 2023年6月11日
    0136
  • 页面静态化

    网站的首页频繁被访问,为了提升访问速度,除了我们之前已经学过的使用缓存技术外,还可以使用页面静态化技术。 页面静态化即将动态渲染生成的页面结果保存成html文件,放到静态文件服务器…

    数据库 2023年6月14日
    0124
  • podman对容器映像签名和分发

    熟悉podman 如何使用 Podman 对容器映像进行签名和分发 熟悉podman 此示例容器将运行一个非常基本的 httpd 服务器,该服务器仅为其索引页提供服务 [root@…

    数据库 2023年6月14日
    0146
  • String类常用的API

    String类常用API总结及注意事项 String类常用的API 字符串内容的比较: 注意: 不能使用 == 去比较两个字符串的内容。原理:比较的是字符串的地址。(如果两个字符串…

    数据库 2023年6月16日
    0144
  • Java开源博客系统AngelBlog发布

    一、Java开源博客系统(AngelBlog)系统简介 Angel工作室AngelBlog系统是基于Java Spring boot +前端bootstrap+jquery+lay…

    数据库 2023年6月14日
    0130
  • DNS 查询原理详解

    你可能会问,难道 DNS 服务器(比如 1.1.1.1)保存了世界上所有域名(包括二级域名、三级域名)的 IP 地址? 当然不是。DNS 是一个分布式系统,1.1.1.1 只是用户…

    数据库 2023年6月14日
    0170
  • 数据库原理三—MySQL数据库优化

    MySQL优化 MySQL优化分为以下几个大类: 数据库调优在一般情况下都是SQL调优,那么,应该如何进行SQL调优呢? id select_type description 1 …

    数据库 2023年6月6日
    0299
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球