1

私は SQL 2008 を使用しており、テーブルにあるデータをバッチで処理しようとしていますが、問題があります。データはグループに分割され、処理を行う際に、グループが常にバッチ内に含まれるようにする必要があります。つまり、グループが異なるバッチに分割されないようにする必要があります。バッチ サイズは常にグループ サイズよりもはるかに大きいと想定されています。これが私の意味を説明するためのセットアップです(コードはJeff Modenのデータ生成ロジックを使用しています:http://www.sqlservercentral.com/articles/Data+Generation/87901

DECLARE @NumberOfRows INT = 1000,
    @StartValue   INT = 1,
    @EndValue     INT = 500,
    @Range        INT

SET @Range = @EndValue - @StartValue + 1

IF OBJECT_ID('tempdb..#SomeTestTable','U') IS NOT NULL
DROP TABLE #SomeTestTable;

SELECT TOP (@NumberOfRows)
GroupID = ABS(CHECKSUM(NEWID())) % @Range + @StartValue
INTO #SomeTestTable
FROM sys.all_columns ac1
CROSS JOIN sys.all_columns ac2

これにより、それぞれに 1 ~ 7 個のレコードを含む、約 435 個のレコード グループを持つテーブルが作成されます。ここで、バッチごとに 100 レコードのバッチでこれらのレコードを処理したいとします。GroupID が異なるバッチ間で分割されないようにするにはどうすればよいですか? 各バッチが正確に 100 レコードでなくても問題ありません。多少多くても少なくてもかまいません。

提案に感謝します!

4

1 に答える 1

1

これにより、100 エントリよりもわずかに小さいバッチが生成され、完全に選択されていないすべてのグループが削除されます。

WITH cte AS (SELECT TOP 100 * FROM (
  SELECT GroupID, ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY GroupID) r
  FROM #SomeTestTable) a
  ORDER BY GroupID, r DESC)
SELECT c1.GroupID FROM cte c1
  JOIN cte c2
    ON c1.GroupID = c2.GroupID
   AND c2.r = 1

GroupID が最小のグループを選択し、行番号とともに共通テーブル式への 100 エントリに制限します。次に、行番号を使用して、選択範囲に完全に含まれていないグループを破棄します (行番号行番号は TOP で切り取る前に降順に並べられるため、グループを選択するには 1 を選択する必要があります)。

于 2013-02-14T06:54:28.827 に答える