使用 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;
我试图在 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;