Jon*_*nno 5 sql sql-server range gaps-and-islands
我在 SQL Server 2008R2 中有一个位置表(定义如下)。
系统框中有位置。
我需要找到一个盒子,其中还有 X 个空闲位置。但是,X 位置必须是连续的(从左到右、从上到下,即递增的 PositionID)。
构建一个查找具有 X 个空闲位置的框的查询非常简单。我现在遇到的问题是确定位置是否连续。
关于基于 TSQL 的解决方案有什么建议吗?
表定义
` 创建表 [dbo].[位置](
[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,
[样品ID] [int] NULL,
[更改原因] [nvarchar](4000) NOT NULL,
[最后用户ID] [int] NOT NULL,
[TTSID] [bigint] NULL,
约束 [PK_Position] 主键聚集
(
[职位ID] ASC
)WITH (PAD_INDEX = OFF、STATISTICS_NORECOMPUTE = OFF、IGNORE_DUP_KEY = OFF、ALLOW_ROW_LOCKS = ON、ALLOW_PAGE_LOCKS = ON) ON [主要]
) 在 [主要]`
编辑
http://pastebin.com/V8DLiucN - 包含 1 个框样本位置的 Pastebin 链接(样本数据中所有位置均为空)
编辑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
Run Code Online (Sandbox Code Playgroud)
诀窍是语句PositionID - rn中的(行号)GROUP BY。这可以将连续的集合组合在一起......并且从那里可以很容易地执行 aHAVING将结果限制为BoxID具有所需数量的空闲槽的 s 。