Как определить размер непрерывного диапазона по заданным критериям?

У меня есть таблица позиций в 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.


person Jonno    schedule 12.07.2011    source источник
comment
Не могли бы вы предоставить образцы данных с помощью сценария SQL?   -  person Chris    schedule 12.07.2011
comment
@Chris - Спасибо, что посмотрели, ссылка на образец данных опубликована   -  person Jonno    schedule 12.07.2011
comment
Какое из этих (или других) требований является правильным ?: 1) Учитывая количество свободных позиций, X, найдите один или все совпадающие поля; или 2) просто найдите все коробки со свободными непрерывными позициями и посчитайте эти позиции. Если в определенном ящике есть группа из 5 непрерывных (от 10 до 14) и другая группа из 10 непрерывных (от 51 до 60) свободных позиций, сколько там позиций?   -  person Clodoaldo Neto    schedule 12.07.2011


Ответы (1)


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, которые имеют необходимое количество свободных слотов.

person Michael Fredrickson    schedule 12.07.2011