T-SQL 查询批量处理数据而不破坏组

标签 t-sql 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 不会在不同批处理之间 split ?如果每个批处理不是正好 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 的组,限制为公共(public)表表达式中的 100 个条目以及行号,然后它将使用行号丢弃任何不完全在选择中的组(行号 1 需要位于要选择的组中,因为在使用 TOP 剪切之前行号按降序排列)。

关于T-SQL 查询批量处理数据而不破坏组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14869010/

相关文章:

Windows:比较文件夹中的文件并删除不存在的文件

c# - 根据连续调用之间耗时优化批量大小

SQL:使用冗余联合代码优化嵌套查询?

sql-server-2008 - 如何在存储过程中仅返回单个结果集

sql - 参数只能与其他参数一起工作,但我希望它们独立工作

linux - 删除多个 csv 文件的第一行或行(标题)和第一列

linux - 如何在 bash 命令行上使用 awk 的输出

notifications - 解析 API : batch push notifications

sql - SQL Server 2005数据库中的新触发器

sql - SQL Server 中与 Null 的连接