2011-11-02 163 views
3
在表

我有數據在以下格式SQL查詢來更新行

ID DocNumber RevOrder 
1 DOC-001  NULL 
2 DOC-001  NULL 
3 DOC-001  NULL 
4 DOC-002  NULL 
5 D0C-002  NULL 
6 D0C-003  NULL 

我需要在更新RevOrder列格式如下

ID DocNumber RevOrder 
1 DOC-001  3 
2 DOC-001  2 
3 DOC-001  1 
4 DOC-002  2 
5 D0C-002  1 
6 D0C-003  1 

邏輯是:DocNumber可被複制和帶有最大ID的DocNumber獲得RevOrder = 1,然後獲取RevOrder = 2等等......我如何實現上述場景?

+0

你不期待'DOC_001'的下一個實例重新編號的一切都是你?也就是說,讓'id = 1'將RevOrder更改爲4? –

回答

3

使用基於一個ROW_NUMBER()在分區此UPDATE聲明:

;WITH UpdateData AS 
(
    SELECT 
     ID, DocNumber, 
     ROW_NUMBER() OVER(PARTITION BY DocNumber ORDER BY ID DESC) AS 'RowNum' 
    FROM dbo.YourTable 
) 
UPDATE dbo.YourTable 
SET RevOrder = RowNum 
FROM dbo.YourTable t 
INNER JOIN UpdateData ud ON t.ID = ud.ID 
0

從SQL Server 2005及以上版本,你可以使用

RANK() OVER (PARTITION BY DocNumber ORDER BY ID ASC) AS RevOrder 
+0

@marc_s不,它按DocNumber進行分區(因此排序會根據請求在DocNumber的每次更改時重新開始)。它的行爲非常像您提出的ROW_NUMBER()解決方案,除了RANK()會給具有相同DocNumber和相同ID的行賦予相同的編號。由於ID是唯一的,我認爲RANK()的行爲與此ROW_NUMBER()完全相同。然而,在更一般的情況下,使用ROW_NUMBER()的解決方案更爲正確。 –

0

我想具有分區by子句的row_number()函數將工作

declare @temp as table(
ID int not null 
,Doc_Num varchar(20) not null 
,RevOrder int null 
) 
insert into @temp 
values 
(1,'DOC-001',null) 
,(2,'DOC-001',null) 
,(3,'DOC-001',null) 
,(4,'DOC-002',null) 
,(5,'DOC-002',null) 
,(6,'DOC-003',null) 


select * from @temp 


select 
t.ID 
,t.Doc_Num 
,ROW_NUMBER() over(partition by t.Doc_num order by t.ID desc) 
from 
@temp t 
order by t.ID