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。

是否可以在没有光标的情况下执行此操作?

最佳答案

您可以使用CTErow_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

10-01 02:31