按 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
我正在使用的当前数据库有一个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