如何确定给定标准的连续范围的大小?
我在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
是很容易的。
上一篇: How to determine size of continious range for given criteria?