如何更新除该组中最新项目之外的一组行

时间:2018-02-28 07:16:15

标签: sql sql-server sql-server-2008 sql-server-2005

我需要能够更新表格中特定字段匹配的每一行,但不能更新匹配组的最新行。

让我们说

示例:

我有10行:

  • 5行具有匹配字段,例如,Field1 = 23
  • 和另外5个具有匹配字段,例如,Field1 = 56

我需要更新每个匹配组中的4行,而不会触及最新的项目。

没有修复任何值,我不知道会有多少行或有多少组,上面只是一个例子。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用ROW_NUMBER()枚举行,使用CTE来定义要更新的结果集。使用行号,您可以有选择地更新每个分区的前4行:

;WITH ToUpdate AS (
   SELECT Field1,
          ROW_NUMBER() OVER (PARTITION BY Field1 ORDER BY myOrderColumnn) AS rn
   FROM mytable
   WHERE Field1 IN (23, 56)
)
UPDATE ToUpdate 
SET Field1 = 'myValue'
WHERE rn <= 4

如果您需要排除最后一项,并且您不知道每个分区的精确数量,那么您可以撤消排序并过滤掉第一条记录:

;WITH ToUpdate AS (
   SELECT Field1,
          ROW_NUMBER() OVER (PARTITION BY Field1 
                             ORDER BY myOrderColumnn DESC) AS rn
   FROM mytable
   WHERE Field1 IN (23, 56)
)
UPDATE ToUpdate 
SET Field1 = 'myValue'
WHERE rn > 1