从SQL Server中的表中查找可用范围

时间:2017-08-31 07:06:29

标签: sql-server sql-server-2016

我有一张桌子,其中包含开始和结束列,均为INT。我需要找到与现有数据相比较的第一个可用N范围。

表架构

CREATE TABLE [dbo].[MSRange]
(
    [RangeId] [int] IDENTITY(1,1) NOT NULL,
    [RangeStart] [int] NOT NULL,
    [RangeEnd] [int] NOT NULL,
    CONSTRAINT [PK_MSRange] 
       PRIMARY KEY CLUSTERED ([RangeId] ASC)
) ON [PRIMARY]

种子数据示例:

INSERT INTO [dbo].[MSRange] ([RangeStart], [RangeEnd])
VALUES (1, 150), (1250, 1500), (3100, 7500), (10500, 15000);

要求:

我需要找到1000个插槽的占位符,显然我们可以说151到1150的种子数据可用。类似地,对于1500个插槽,意味着1501到3000可用。

请帮助我如何获得第一个占位符。

1 个答案:

答案 0 :(得分:2)

declare @MSRange table
(
    [RangeId] [int] IDENTITY(1,1) NOT NULL primary key,
    [RangeStart] [int] NOT NULL,
    [RangeEnd] [int] NOT NULL
) 

INSERT INTO @MSRange ([RangeStart], [RangeEnd])
VALUES (1, 150), (1250, 1500), (3100, 7500), (10500, 15000);

declare @N int = 1000;

with cte as
(
select RangeId, 
       RangeEnd as result_range_start, 
       isnull(lead(RangeStart) over(order by RangeId), 2147483647) as result_range_end

from @MSRange
)

select top 1 result_range_start + 1, result_range_start + @N
from cte
where result_range_end - result_range_start > @N
order by RangeId;

此代码适用于以2012开头的版本。对于@@version< = 2008 R2同样的想法,但使用row_number()加入当前的