连续天数的数据:Oracle 与 MySQL 查询技巧

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 连续天数的数据:Oracle 与 MySQL 查询技巧

问题:最近有开发需求,查询最近一个月连续天数>=2的数据项,我这里数据库日期存储的是yyyymmdd,字符串 (可自行根据自身情况修改)

思路:如果可以找到连续日期的开始与结束时间,那么就可以 where 日期 between 开始日期 and 结束日期即可

关键代码(Mysql方式):

1. SELECT
2.  STAT_DATE, -- 数据库日期字段,我这里是yyyymmdd形式的字符串存储
3.  DATE_ADD( b.STAT_DATE, INTERVAL - ( @rownum := @rownum + 1 ) DAY ) ROWNUM -- 序列
4. FROM
5.  ( SELECT @rownum := 0 ) a,
6.  YCYP_TG_ABN_ANALYSE b 
7.  WHERE -- 筛选条件,筛选最近一个月的数据(2022-07-01是前端传的参数)
8.  b.TG_ID = '4110100001'
9.  AND b.STAT_DATE BETWEEN DATE_FORMAT( DATE_ADD( '2022-07-01', INTERVAL - 30 DAY ), '%Y%m%d' ) 
10.   AND DATE_FORMAT( str_to_date( '2022-07-01', '%Y-%m-%d' ), '%Y%m%d' ) 
11. ORDER BY
12.   b.STAT_DATE ASC

结果如下:

我们发现,所有最近一个月的日期都会被查询出来,并且有个ROWNUM 标记字段,有没有发现,如果是连续日期的话,ROWNUM值是一样的。

所以我们紧接着根据ROWNUM分组,找出分组后个数>=2的,然后求每个分组的最小日期,降序(由于有多个连续天数的话,我们取最近的)

1. SELECT
2.  MIN( t1.STAT_DATE ) AS stat_date,
3.  MAX( t1.STAT_DATE ) AS end_time 
4. FROM
5.  (
6.  SELECT
7.    STAT_DATE,-- 数据库日期字段,我这里是yyyymmdd形式的字符串存储
8.    DATE_ADD( b.STAT_DATE, INTERVAL - ( @rownum := @rownum + 1 ) DAY ) ROWNUM -- 序列
9. 
10.   FROM
11.     ( SELECT @rownum := 0 ) a,
12.     YCYP_TG_ABN_ANALYSE b 
13.     WHERE-- 筛选条件,筛选最近一个月的数据(2022-07-01是前端传的参数)
14.     b.TG_ID = '4110100001'
15.     AND b.STAT_DATE BETWEEN DATE_FORMAT( DATE_ADD( '2022-07-01', INTERVAL - 30 DAY ), '%Y%m%d' ) 
16.     AND DATE_FORMAT( str_to_date( '2022-07-01', '%Y-%m-%d' ), '%Y%m%d' ) 
17.   ORDER BY
18.     b.STAT_DATE ASC
19.   ) t1 
20. GROUP BY
21.   t1.ROWNUM 
22. HAVING
23.   count(*) >= 2
24. ORDER BY
25.   stat_date DESC
26. LIMIT 1

如图:我们就得到了连续日期的开始和结束日期,排序过后,我们需要加个limit 1,因为只取最近的连续日期。

所以 limit 1 之后,最终得到结果

20220629 ---2022-0701

那我们只需要在表中查询时间在这个范围内的即可。

oracle代码(Oracle方式):

1. SELECT
2.  start_date,
3.  end_date 
4. FROM
5.  (
6.  SELECT
7.    MIN( STAT_DATE ) AS start_date,
8.    MAX( STAT_DATE ) AS end_date 
9.  FROM
10.     (
11.     SELECT
12.       STAT_DATE,
13.       TO_DATE( STAT_DATE, 'YYYY-MM-DD' ) - ROW_NUMBER ( ) OVER ( PARTITION BY TG_ID ORDER BY STAT_DATE ) AS grp 
14.     FROM
15.       YCYP_TG_ABN_ANALYSE 
16.     WHERE
17.       TG_ID = '4110100001'
18.       AND STAT_DATE BETWEEN TO_CHAR( TO_DATE( '2022-07-01', 'YYYY-MM-DD' ) - 30, 'YYYYMMDD' ) 
19.       AND REPLACE ( '2022-07-01', '-', '' ) 
20.     ) 
21.   GROUP BY
22.     grp 
23.   HAVING
24.     COUNT( * ) >= 2
25.   ORDER BY
26.     start_date DESC
27.   ) 
28. WHERE
29.   ROWNUM = 1

结果:

注意

这里的tg_id是分组的列,可以理解为如果tg_id不一样,就算日期连续,但是不是一类,也不会给分配一样的行号。(自行根据自己所需业务填写)

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
113 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
7天前
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle的还原数据
Oracle数据库中的还原数据(也称为undo数据或撤销数据)存储在还原表空间中,主要用于支持查询的一致性读取、实现闪回技术和恢复失败的事务。文章通过示例详细介绍了还原数据的工作原理和应用场景。
【赵渝强老师】Oracle的还原数据
|
7天前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
39 14
|
10天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
39 9
|
11天前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
37 3
|
17天前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
15天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
77 1
|
18天前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
38 1
|
7天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
7天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的数据文件
在Oracle数据库中,数据库由多个表空间组成,每个表空间包含多个数据文件。数据文件存储实际的数据库数据。查询时,如果内存中没有所需数据,Oracle会从数据文件中读取并加载到内存。可通过SQL语句查看和管理数据文件。附有视频讲解及示例。

推荐镜像

更多