1、实际问题

连续范围问题也是一个非常经典的SQL编程问题,在实际的开发中也经常使用,处理的方法有比较多,但是一般采用数字辅助表和分组。

如下例子:

create table t(a int unsigned not null primary key);

insert into t value(1);
insert into t value(2);
insert into t value(3);
insert into t value(100);
insert into t value(101);
insert into t value(103);
insert into t value(104);
insert into t value(105);

上面的数据如何重到连续范围:

image.png

2、解决方法
我们看下面的语句返回的结果:
select a,@a := @a+1 rn from t,(select @a:=0) as a;

image.png

通过上面的辅助列RN说明,如果SQL结果将a-rn值,如果是不变的,说明是连续的,

SELECT a,rn,a-rn
FROM(
SELECT a,@a := @a+1 rn FROM t,(SELECT @a:=0) AS a) b

image.png

认真分析以后,再做一下分组
SELECT MIN(a) start_range,MAX(a) start_range FROM(
SELECT a,rn,a-rn AS diff
FROM(
SELECT a,@a := @a+1 rn FROM t,(SELECT @a:=0) AS a) b
) c
GROUP BY diff

image.png

3、结果一下经验:
在实际开发中,有关连续范围和间断范围会用到数字辅助表和分组来解决此类问题。


高山流水
1 声望0 粉丝

高山流水,本人从事于数据库行业多年,但是一直没有把这行技术沉淀下来,祈愿通过这么好的一个平台想写点心得与天下同行的共勉,共知,共识。