Mat*_*ttH 6 sql t-sql sql-server sql-server-2008
简化我的问题 - 我有6位数的字段,从1开始为999999结束为客户分配数字.大多数数字是按顺序分配的,但数字可以由用户手动分配,并且此功能在整个过程中以不可预测的模式使用范围.
我们现在需要识别尚未分配的数字(简单) - 然后将其转换为多个范围(看起来很复杂).
例如,给定了以下数字
1,2,3,4,5,
1001,1002,1003,1004,1005,
999101,999102,999103,999104,999105
Run Code Online (Sandbox Code Playgroud)
我需要一组结果范围
Start End
6 1000
1006 999100
999106 999999
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的想法是,在查询中写入可能过于复杂 - 最好通过从1到999999的循环来实现,并将范围添加到临时表中.
有兴趣听到我能想象的想法,有一些方法.我正在使用SQL Server 2008 R2.这是一次性练习,因此即使非SQL解决方案也可能是合适的,例如,这可以在Excel中轻松完成.
试试这个
declare @t table (num int)
insert @t values (2),(3),(6),(7),(9),(10),(11)
select
MIN(number) as rangestart,
MAX(number) as rangeend
from
(
select *,
ROW_NUMBER() over (order by number) -
ROW_NUMBER() over (order by num,number) grp
from
(
select number from master..spt_values where type='p' and number between 1 and 15
) numbers
left join @t t
on numbers.number = t.num
) v
where num is null
group by grp
Run Code Online (Sandbox Code Playgroud)
参考:itzik ben-gan的空白和岛屿
创建高达999999的数字查询
select p1.number + p2.number * 2048 as number
from
(select * from master..spt_values where type='p' ) p1,
(select * from master..spt_values where type='p' and number<489) p2
where p1.number + p2.number * 2048 <=999999
Run Code Online (Sandbox Code Playgroud)