4

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

在系统框中有位置。

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

构造一个查找具有 X 个空闲位置的框的查询很简单。我现在有确定位置是否连续的问题。

关于基于 TSQL 的解决方案的任何建议?

表定义

` 创建表 [dbo].[位置](
        [PositionID] [int] IDENTITY(1,1) 非空,
        [BoxID] [int] 非空,
        [pRow] [int] 非空,
        [pColumn] [int] 非空,
        [pRowLetter] [char](1) 非空,
        [pColumnLetter] [char](1) 非空,
        [SampleID] [int] NULL,
        [更改原因] [nvarchar](4000) 非空,
        [LastUserID] [int] 非空,
        [TTSID] [bigint] 空,
     约束 [PK_Position] 主键集群
    (
        [职位ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) 在 [主要] 上`

编辑

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

编辑 2

“空闲”位置是 SampleID = null

4

1 回答 1

2
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

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

于 2011-07-12T15:43:25.087 回答