SQL查询以更新行

3

我有一个表格,格式如下:

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 等等... 我该如何实现上述情景?

你不是期望下一个 DOC_001 实例重新编号所有东西吧?也就是说,将 id = 1 改为 RevOrder 4? - Clockwork-Muse
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

@marc_s 不是的,它按照DocNumber进行分区(因此在每次DocNumber更改时重新开始排名,正如所请求的那样)。 它的行为与您提出的使用ROW_NUMBER()的解决方案非常相似,只是RANK()会为具有相同DocNumber和相同ID的行提供相同的编号。 由于ID是唯一的,我认为RANK()在这种情况下的行为将与ROW_NUMBER()完全相同。 然而,在更一般的情况下,您使用ROW_NUMBER()的解决方案更正确。 - Paolo Falabella

0

0

我认为使用带有partition 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接