对于给定的标准,如何确定连续范围的大小



我有一个位置表在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,[changerreason] [nvarchar](4000) NOT NULL,[LastUserID] [int] NOT NULL,[TTSID] [bigint] NULL,约束[PK_Position]主键群集([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 s有所需的空闲槽。

相关内容

  • 没有找到相关文章

最新更新