按 SQL 将列更新为组中的行号

Update a column to the row number in a group by SQL

我正在使用的当前数据库有一个table,其中定义的位置已经乱序。 我有以下查询,它可以让我将位置更新为行号 (RN),但仅适用于具有 ParentId

的一组对象
SELECT id, ParentId, Position, Title, -1+ ROW_NUMBER() OVER (ORDER BY [Position]) as RN
FROM Objects
where ParentId = 4390

但是有多个 ParentId 组。

我的问题是如何将此查询应用于整个对象 table 同时保持这些分组和行号增量正确?

我知道我可以使用游标遍历 ParentIds 列表,但这感觉效率很低。

您需要添加一个 PARTITION BY

SELECT id
    ,ParentId
    ,Position
    ,Title
    ,-1+ ROW_NUMBER() OVER (PARTITION BY ParentId ORDER BY [Position]) as RN
FROM Objects

更新我会使用 CTE

WITH CTE AS ( 
    SELECT id
        ,ParentId
        ,Position
        ,Title
        ,-1+ ROW_NUMBER() OVER (PARTITION BY ParentId ORDER BY [Position]) as NewPosition
    FROM Objects
) 
UPDATE CTE 
SET Position = NewPosition 
WHERE Position <> NewPosition