Oracle中判断数字或日期是否连续

实际开发中可能会遇到判断日期时间是不是连续的,数字是不是连续的,这时候可以给字段做个row_number排序,然后字段和排序的数字相减,如果相减后的结果一个固定值,则说明这一列的数据是连续的,数字连续和日期连续都可以采用此逻辑来判断。

数据准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`test_name` varchar(255),
`test_number` int(11),
`test_date` date
);
INSERT INTO `test` VALUES ('张三', 1, '2022-09-29');
INSERT INTO `test` VALUES ('张三', 3, '2022-09-30');
INSERT INTO `test` VALUES ('张三', 6, '2022-10-01');
INSERT INTO `test` VALUES ('张三', 8, '2022-10-02');
INSERT INTO `test` VALUES ('李四', 5, '2022-09-29');
INSERT INTO `test` VALUES ('李四', 6, '2022-10-02');
INSERT INTO `test` VALUES ('李四', 7, '2022-10-04');
INSERT INTO `test` VALUES ('李四', 8, '2022-10-06');

数字连续

实现思路:先用row_number() over()函数,对人名(test_name)进行分组,对数字(test_number)进行正序排序,得到每个数字的排列顺序,用数字减去排序的数字,如果数字是连续的,那么每一行两者相减会得到一个相同的数字。

1
2
3
4
select	test_name,test_number,
row_number() over(partition by test_name order by test_number) rn, --排序的序号
test_number - row_number() over(partition by test_name order by test_number) diff --差值
from test

输出结果:

由此可以判断:李四的数字是连续的。

日期连续

实现思路与数字连续判断类似,对日期排序,日期减去排序的数字,得到一个固定的日期。

1
2
3
4
select	test_name,test_date,
row_number() over(partition by test_name order by test_date) rn,
date_sub(test_date,interval row_number() over(partition by test_name order by test_date) day) diff
from test

输出结果如下:

因此可知,张三的日期是连续的。

------ 本文完 ------