如何确定给定标准的连续范围的大小?

我在SQL Server 2008R2中有一个职位表(定义如下)。

在系统框中有位置。

我有一个要求找到一个盒子,剩下X个空位。 但是,X位置必须是连续的(从左到右,从上到下,即上升的PositionID)。

构造一个查询可以很容易找到一个X空格的空格。 我现在有问题确定这些头寸是否连续。

对基于TSQL的解决方案有何建议?

表定义

` CREATE TABLE [dbo].[Position](
        [PositionID] [int] IDENTITY(1,1) NOT NULL,
        [BoxID] [int] NOT NULL,
        [pRow] [int] NOT NULL,
        [pColumn] [int] NOT NULL,
        [pRowLetter] [char](1) NOT NULL,
        [pColumnLetter] [char](1) NOT NULL,
        [SampleID] [int] NULL,
        [ChangeReason] [nvarchar](4000) NOT NULL,
        [LastUserID] [int] NOT NULL,
        [TTSID] [bigint] NULL,
     CONSTRAINT [PK_Position] PRIMARY KEY CLUSTERED 
    (
        [PositionID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]`

编辑

http://pastebin.com/V8DLiucN - pastebin与1个样本位置的链接(样本数据中的所有位置均为空)

编辑2

“空闲”位置是SampleID = null的位置


DECLARE @AvailableSlots INT
SET @AvailableSlots = 25

;WITH OrderedSet AS (
SELECT
    BoxID,
    PositionID,
    Row_Number() OVER (PARTITION BY BoxID ORDER BY PositionID) AS rn
FROM
    Position
WHERE 
    SampleID IS NULL
)
SELECT
    BoxID,
    COUNT(*) AS AvailableSlots,
    MIN(PositionID) AS StartingPosition,
    MAX(PositionID) AS EndingPosition
FROM
    OrderedSet
GROUP BY
    PositionID - rn,
    BoxID
HAVING
    COUNT(*) >= @AvailableSlots

技巧是GROUP BY语句中的PositionID - rn (行号)。 这可以将连续集合组合在一起......并且从那里开始HAVING将结果限制到具有所需空闲插槽数量的BoxID是很容易的。

链接地址: http://www.djcxy.com/p/84111.html

上一篇: How to determine size of continious range for given criteria?

下一篇: Bug in our SQL or Entity Framework?