Oracle与Mysql求连续天数的数据

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

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

关键代码(Mysql方式):

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

结果如下:

Oracle与Mysql求连续天数的数据_第1张图片

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

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

SELECT
	MIN( t1.STAT_DATE ) AS stat_date,
	MAX( t1.STAT_DATE ) AS end_time 
FROM
	(
	SELECT
		STAT_DATE,-- 数据库日期字段,我这里是yyyymmdd形式的字符串存储
		DATE_ADD( b.STAT_DATE, INTERVAL - ( @rownum := @rownum + 1 ) DAY ) ROWNUM -- 序列
		
	FROM
		( SELECT @rownum := 0 ) a,
		YCYP_TG_ABN_ANALYSE b 
		WHERE-- 筛选条件,筛选最近一个月的数据(2022-07-01是前端传的参数)
		b.TG_ID = '4110100001' 
		AND b.STAT_DATE BETWEEN DATE_FORMAT( DATE_ADD( '2022-07-01', INTERVAL - 30 DAY ), '%Y%m%d' ) 
		AND DATE_FORMAT( str_to_date( '2022-07-01', '%Y-%m-%d' ), '%Y%m%d' ) 
	ORDER BY
		b.STAT_DATE ASC 
	) t1 
GROUP BY
	t1.ROWNUM 
HAVING
	count(*) >= 2 
ORDER BY
	stat_date DESC 
LIMIT 1

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

Oracle与Mysql求连续天数的数据_第2张图片

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

20220629 ---2022-0701 

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

oracle代码(Oracle方式):

SELECT
	start_date,
	end_date 
FROM
	(
	SELECT
		MIN( STAT_DATE ) AS start_date,
		MAX( STAT_DATE ) AS end_date 
	FROM
		(
		SELECT
			STAT_DATE,
			TO_DATE( STAT_DATE, 'YYYY-MM-DD' ) - ROW_NUMBER ( ) OVER ( PARTITION BY TG_ID ORDER BY STAT_DATE ) AS grp 
		FROM
			YCYP_TG_ABN_ANALYSE 
		WHERE
			TG_ID = '4110100001' 
			AND STAT_DATE BETWEEN TO_CHAR( TO_DATE( '2022-07-01', 'YYYY-MM-DD' ) - 30, 'YYYYMMDD' ) 
			AND REPLACE ( '2022-07-01', '-', '' ) 
		) 
	GROUP BY
		grp 
	HAVING
		COUNT( * ) >= 2 
	ORDER BY
		start_date DESC 
	) 
WHERE
	ROWNUM = 1

结果:

Oracle与Mysql求连续天数的数据_第3张图片

注意: 

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

你可能感兴趣的:(数据库)