如何更新一组行,不包括该组中的最新项目
How do I update a group of rows excluding the latest item in that group
我需要能够更新 table 中特定字段匹配的每一行,但不是匹配组的最新行。
所以让我们说
示例:
我有 10 行:
- 5 行有匹配字段 say, Field1=23
- 另外 5 个有一个匹配的字段,Field1=56
我需要更新每个匹配组中的 4 行,同时保留最新的项目。
没有固定的值,我不知道会有多少行或多少组,以上只是一个例子。
感谢您的帮助。
您可以使用 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
我需要能够更新 table 中特定字段匹配的每一行,但不是匹配组的最新行。
所以让我们说
示例:
我有 10 行:
- 5 行有匹配字段 say, Field1=23
- 另外 5 个有一个匹配的字段,Field1=56
我需要更新每个匹配组中的 4 行,同时保留最新的项目。
没有固定的值,我不知道会有多少行或多少组,以上只是一个例子。
感谢您的帮助。
您可以使用 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