T-SQL Query可以批量处理数据而不会破坏组

时间:2013-02-14 06:30:20

标签: tsql batch-processing

我正在使用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

这将创建一个包含大约435组记录的表,每组记录包含1到7条记录。现在,假设我想要每批100个记录批量处理这些记录。如何确保我的GroupID不会在不同批次之间分开?我很好,如果每批不是100个记录,可能会多一点或少一点。

我感谢任何建议!

1 个答案:

答案 0 :(得分:0)

这将导致批次略小于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

它选择组ID最小的组,限制为公共表表达式中的100个条目以及行号,然后它将使用行号丢弃任何组并不是完全在选择中(第1行需要在组的选择中,因为在使用TOP切割之前行号按降序排列)。