2011-08-05 12 views
5

SQL Server 2005TSQL - Auto Przyrost w instrukcji UPDATE

Mam tabelę zawierającą następujące informacje: -

[order_id]  [index_1] 
600020001  0 
600020002  0 
600020002  0 
600020002  0 
600020003  0 
... 

który musi zostać zaktualizowana: -

[order_id]  [index_1] 
600020001  1 
600020002  1 
600020002  2 
600020002  3 
600020003  1 

I próbuję napisać instrukcję UPDATE, która będzie wypełniać pole index_1, jak w powyższym przykładzie. Mogę to osiągnąć za pomocą CURSORA, ale najlepiej byłoby to zrobić bez, jeśli to możliwe.

Dla każdego nowego numeru porządkowego numerowanie zostanie ponownie uruchomione. Dla każdego wiersza order_id pole indeksu jest zwiększane o 1.

Czy można to zrobić bez kursora?

Odpowiedz

13

Możesz użyć CTE i row_number(), aby zrobić to, co chcesz. Tabela @T w poniższym kodzie służy jedynie do demonstracji. Zastąp @T dowolną nazwą tabeli.

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 

Wynik:

order_id index_1 
----------- ----------- 
600020001 1 
600020002 1 
600020002 2 
600020002 3 
600020003 1 
+1

+1 za korzystanie 'row_number() na partycję (..)'. Pasuje tu jak rękawiczka. –

+0

Dziękuję. Osiąga dokładnie to, co chcę robić. –