从 SQL 服务器中的 Table 查找可用范围
Find the available Range from a Table in SQL Server
我有一个 table,其中包含开始和结束列都是 INT
。我需要找到与现有数据比较的第一个可用 N
范围。
Table 架构:
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 是可用的。
请帮助我如何获得第一个可用的占位符。
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()
加入然后当前与以前的
我有一个 table,其中包含开始和结束列都是 INT
。我需要找到与现有数据比较的第一个可用 N
范围。
Table 架构:
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 是可用的。
请帮助我如何获得第一个可用的占位符。
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()
加入然后当前与以前的