我需要能够更新表格中特定字段匹配的每一行,但不能更新匹配组的最新行。
让我们说
示例:
我有10行:
我需要更新每个匹配组中的4行,而不会触及最新的项目。
没有修复任何值,我不知道会有多少行或有多少组,上面只是一个例子。
感谢您的帮助。
答案 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