用于更新行的SQL查询

时间:2011-11-02 16:31:05

标签: sql sql-server

我在表格中有以下格式的数据

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等...我怎样才能实现以上场景?

4 个答案:

答案 0 :(得分:3)

根据分区上的UPDATE使用此ROW_NUMBER()语句:

;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

答案 1 :(得分:0)

从SQL Server 2005及更高版本开始,您可以使用

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

答案 2 :(得分:0)

使用ROW_NUMBER()& PARTITION BY

SELECT  ID,
        DocNumber,
        ROW_NUMBER() OVER(PARTITION BY DocNumber ORDER BY DocNumber DESC) AS RevOrder
FROM    @TestTable

您可以在此处查看/测试一个有效的示例:http://data.stackexchange.com/stackoverflow/q/116435/

答案 3 :(得分: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