我在表格中有以下格式的数据
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 :(得分: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