Tsql 在不中断组的情况下批量处理数据的T-SQL查询

Tsql 在不中断组的情况下批量处理数据的T-SQL查询,tsql,batch-processing,Tsql,Batch Processing,我正在使用SQL2008,并试图分批处理表中的数据,但有一个问题。数据被分为多个组,在我进行处理时,我必须确保一个组始终包含在一个批中,或者换句话说,该组永远不会被分割到不同的批中。假设批量大小总是比组大小大得多。下面的设置说明了我的意思(代码使用Jeff Moden的数据生成逻辑:) 这将创建一个表,其中包含大约435组记录,每组中包含1到7条记录。现在,让我们假设我想以每批100条记录的方式处理这些记录。如何确保我的GroupID不会在不同批次之间被拆分?我很好,如果每批不是100条记录,它

我正在使用SQL2008,并试图分批处理表中的数据,但有一个问题。数据被分为多个组,在我进行处理时,我必须确保一个组始终包含在一个批中,或者换句话说,该组永远不会被分割到不同的批中。假设批量大小总是比组大小大得多。下面的设置说明了我的意思(代码使用Jeff Moden的数据生成逻辑:)

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


谢谢你的建议

这将导致批量略小于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个条目以及行号,然后它将使用行号丢弃所有不完全在选择中的组(行号1需要在待选择的组中,因为行号在使用TOP进行切割之前是按降序排列的)。

这将导致批量略小于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个条目以及行号,然后它将使用行号丢弃所有不完全在选择中的组(行号1需要在待选择的组中,因为行号是按降序排列的,然后再与顶部一起剪切)。

非常感谢您的建议!它将帮助我完成我需要的。非常感谢您的建议!它将帮助我完成我需要的。