本例子运用的是range_problem中的表和数据
-
create table range_problem(
-
a int(10) unsigned not null,
-
primary key (a));
-
insert into range_problem values(1);
-
insert into range_problem values(2);
-
insert into range_problem values(3);
-
insert into range_problem values(48);
-
insert into range_problem values(50);
-
insert into range_problem values(51);
-
insert into range_problem values(52);
-
insert into range_problem values(53);
-
insert into range_problem values(66);
-
insert into range_problem values(67);
最终要得到的缺失范围为:
方案一及解决思路:
1、找出start_range该间断点之前的值,然后把该值+1,即为start_range
2、通过间断点找出下一个值,对该值-1,即为end_range
1、对于间断点之前的值:
-
select a
-
from range_problem a
-
where not exists (select *
-
from range_problem b
-
where a.a+1 = b.a)
-
and
-
a < (select max(a)
-
from range_problem);
得出:
若不在父查询中加上and条件,则a列的最大值67将不会排除在外,此处67被筛选出来无意义。
2、在上面的基础上,再通过子查询处理end_range:
-
select a+1 as start_range,
-
(select min(a)-1
-
from range_problem c
-
where c.a > a.a) as end_range
-
from range_problem as a
-
where not exists (select *
-
from range_problem b
-
where a.a+1 = b.a)
-
and
-
a < (select max(a)
-
from range_problem);
这将得出我们想要的缺失范围。
方案二及解决思路:
将range_problem中的数据进行位移匹配,如果是连续的值,那么其差值应该在1,反之大于1:
-
select a cur,
-
(select min(a)
-
from range_problem b
-
where b.a>a.a) next
-
from range_problem a
得出:
根据结果我们可以知道,next-cur=1时,值为连续的,不连续的值为(3,48),(48,50),(53,66)
而我们要求的是(4,47),(49,49),(54,65),即(cur+1,next-1)
在上面的基础上,再加以修改:
-
select cur+1 start_range,next-1 end_range
-
from(select a cur,
-
(select min(a)
-
from range_problem b
-
where b.a > a.a) next
-
from range_problem a) c
-
where next-cur>1;
这将得出我们想要的缺失范围。
最后:
此处演示的是缺失范围是整型类型。在生产环境中遇到的类型可能是整型,也可能是时间类型,两者并非有多大的区别,稍作修改就可以将该例子转换为时间类型。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29773961/viewspace-1255445/
,如需转载,请注明出处,否则将追究法律责任。