我在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 - 带有1个样本位置的pastebin链接(样本数据中所有位置都为空)
编辑2
'free'位置是SampleID = null
的位置答案 0 :(得分: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
。