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.
没有光标可以这样做吗?
答案 0 :(得分:13)
您可以使用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