Как определить размер непрерывного диапазона по заданным критериям? - PullRequest
4 голосов
/ 12 июля 2011

У меня есть таблица положений в SQL Server 2008R2 (определение ниже).

В системных полях есть позиции.

У меня есть требование найти ящик, в котором осталось Х свободных позиций. Однако позиции 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

Свободная позиция - позиция с SampleID = null

1 Ответ

2 голосов
/ 12 июля 2011
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 с требуемым количеством свободных слотов.

...