连续数字区间问题

这个问题来自于某论坛的SQL Server板块,感觉也是比较典型的问题。在这里我把问题进行简化,并给出2种方案,作为备忘。

问题描述

有表Table_Num,如下:

Num
4
5
6
10
11
12
13
20

通过一个查询返回连续数字区间,结果集如下:

StartNumEndNumIntervalNums
463
10134
20201

解决方案1

select
	Num1.Num as StartNum,
	min(Num2.Num) as EndNum,
	min(Num2.Num) - Num1.Num + 1 as IntervalNums
from
	Table_Num Num1
	inner join
	Table_Num Num2
	on
		Num1.Num <= Num2.Num
where
	(Num1.Num - 1) not in (select Num from Table_Num)
	and
	(Num2.Num + 1) not in (select Num from Table_Num)
group by
	Num1.Num

其中where条件找到了Table_Num中的边界数值,group by和min(Num2.Num)保证了数值的连续性。

解决方案2

select
	Num1.Num as StartNum,
	Num2.Num as EndNum,
	Num2.Num - Num1.Num + 1 as IntervalNums
from
	Table_Num Num1
	inner join
	Table_Num Num2
	on
		Num1.Num <= Num2.Num
	inner join
	Table_Num Num3
	on
		Num3.Num between Num1.Num and Num2.Num
where
	(Num1.Num - 1) not in (select Num from Table_Num)
	and
	(Num2.Num + 1) not in (select Num from Table_Num)
group by
	Num1.Num,
	Num2.Num
having
	count(Num3.Num) = Num2.Num - Num1.Num + 1

个人认为解决方案2比较容易理解,Num1和Num2定位边界数值,Num3为介于Num1和Num2之间的所有数值,而数值的连续性是由having子句count(Num3.Num) = Num2.Num – Num1.Num + 1来保证的。

除了以上两种方法,应该还有其他方法,大家可以一起讨论。上述两段查询在SQL Server 2005中测试通过。

转载于:https://www.cnblogs.com/DBFocus/archive/2010/09/15/1827192.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值