SQL Server 2005
我有一个包含以下内容的表:-
[order_id] [index_1]
600020001 0
600020002 0
600020002 0
600020002 0
600020003 0
...
需要更新为:-
[order_id] [index_1]
600020001 1
600020002 1
600020002 2
600020002 3
600020003 1
我正在尝试编写一个UPDATE语句,它将按照上面的示例填充index_1字段。我可以使用CURSOR实现此功能,但理想情况下希望尽可能做到这一点。
对于每个新的order_id,编号都会重新开始。对于每个order_id行,index_1字段都增加1。
是否可以在没有光标的情况下执行此操作?
最佳答案
您可以使用CTE和row_number()做您想要的事情。以下代码中的表@T
仅用于演示。将@T
替换为您的表被调用的任何内容。
declare @T table ([order_id] int, [index_1] int)
insert into @T values
(600020001, 0),
(600020002, 0),
(600020002, 0),
(600020002, 0),
(600020003, 0)
;with cte as
(
select index_1,
row_number() over(partition by order_id order by (select 1)) as rn
from @T
)
update cte
set index_1 = rn
select *
from @T
结果:
order_id index_1
----------- -----------
600020001 1
600020002 1
600020002 2
600020002 3
600020003 1