【问题标题】:Find the available Range from a Table in SQL Server从 SQL Server 中的表中查找可用范围
【发布时间】:2017-08-31 07:06:28
【问题描述】:

我有一个表,其中包含开始和结束列都是INT。我需要找到第一个可用的N Range 与现有数据进行比较。

表架构

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 个可用。

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

【问题讨论】:

  • @TT。我在一个现有的数据库表中工作,它不是一个新的数据库表。所以,现在我通过像这样利用中间的可用数字来优化数据。
  • 他正在寻找的是差距。他的区间实际上是满的,他需要找到放置其他 1000/1500/N 值的位置

标签: sql-server sql-server-2016


【解决方案1】:
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() 加入然后当前与上一个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-10
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多