2011-07-12 48 views
3

我有一個位置表在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個箱樣本位置引擎收錄鏈路

編輯2

A'免費「的位置是SampleID = null

+1

你能通過SQL腳本提供一些示例數據嗎? – Chris

+0

@Chris - 感謝您的關注,樣本數據鏈接已發佈 – Jonno

+0

以下哪個(或另一個)是正確的要求?1)給定多個免費倉位X,找到匹配的一個或所有框;或者2)找到所有具有空閒連續位置的框並計算這些位置。如果在某個盒子裏有一組5個連續的(10到14)和另一組10個連續的(51到60)的空閒位置,那裏有多少個位置? –

回答

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 

訣竅是GROUP BY語句中的PositionID - rn(行號)。這可以將連續集合分組在一起......並且從那裏很容易就可以做一個HAVING來將結果限制爲具有所需空閒插槽數量的BoxID

相關問題