定义范围以覆盖数字序列中的间隙(T-SQL)

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中轻松完成.

pod*_*ska 5

试试这个

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)