4

SQL Server 2008R2 に位置テーブルがあります (以下の定義)。

システムボックスにはポジションがあります。

X 個の空きポジションが残っているボックスを見つける必要があります。ただし、X 位置は連続している必要があります (左から右、上から下、つまり、PositionID の昇順)。

X 位置が空いているボックスを検索するクエリを作成するのは簡単です。現在、位置が連続しているかどうかを判断する問題があります。

TSQL ベースのソリューションに関する提案はありますか?

テーブル定義

` CREATE TABLE [dbo].[位置](
        [位置ID] [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、
        [ChangeReason] [nvarchar](4000) NOT NULL,
        [LastUserID] [int] NOT NULL,
        [TTSID] [bigint] NULL、
     CONSTRAINT [PK_Position] PRIMARY KEY CLUSTERED
    (
        [ポジションID] ASC
    )WITH (PAD_INDEX = オフ、STATISTICS_NORECOMPUTE = オフ、IGNORE_DUP_KEY = オフ、ALLOW_ROW_LOCKS = オン、ALLOW_PAGE_LOCKS = オン) オン [プライマリ]
    ) オン [プライマリ]`

編集

http://pastebin.com/V8DLiucN - 1 ボックスのサンプル位置を含むペーストビン リンク (サンプル データではすべての位置が空)

編集 2

「フリー」ポジションは、SampleID = null のポジションです。

4

1 に答える 1

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

トリックは、ステートメントのPositionID - rn(行番号)です。これは、連続したセットをグループ化するために機能します...そしてそこから、結果を必要な量の空きスロットを持つ sに制限するためにGROUP BYa を実行するのは簡単です。HAVINGBoxID

于 2011-07-12T15:43:25.087 に答える