使用 Row_number() 使用动态序列更新列

Update column with a dynamic sequence with Row_number()

我试图在 MSSQL 中更新 table(A) 的列 (Y),并使用一个升序序列,当同一 table 的另一列 (X) 的值时,该序列会自行重置] 变化。 TableA开头:

id X Y
1 1 1
2 1 1
3 2 1
4 2 1
5 2 1
6 3 1

因为它应该在脚本之后:

id X Y
1 1 1
2 1 2
3 2 1
4 2 2
5 2 3
6 3 1

我尝试使用 row_number() 但在循环中,它修改了所有行: 使用计数器和要递增的变量:

UPDATE dbo.A
SET "Y" = @MyInc
FROM (
            SELECT ROW_NUMBER() OVER ( "Id" ASC) AS row_num_Id
             , Id
             , X
             , Y
        FROM dbo.A)     AS sub
        WHERE row_num_Id = @MyCounter;

这会给你想要的结果

CREATE TABLE #T (
    Id INT NOT NULL, 
    X INT NOT NULL, 
    Y INT NOT NULL
)

INSERT INTO #T(Id, X, Y)
VALUES
(1, 1, 1),
(2, 1, 1),
(3, 2, 1),
(4, 2, 1),
(5, 2, 1),
(6, 3, 1);

GO

WITH WithRowNumbers AS (
    SELECT 
    Id, 
    X, 
    ROW_NUMBER() OVER (PARTITION BY X ORDER BY Id) As RowNumber
    FROM #T
)

UPDATE T 
SET Y = WRN.RowNumber
FROM WithRowNumbers AS WRN
INNER JOIN #T AS T ON T.Id = WRN.Id

SELECT * FROM #T

或者正如@CharlieFace 提到的,您可以进一步简化,因为 CTE 就像是原始视图 table。

UPDATE T 
SET Y = T.RowNumber
FROM WithRowNumbers AS T;