如果这是一个重复的问题,请提前解决,我没有注意到:(
我有一张表格如下:
VersionID DocumentID VersionNo
111 12345 1
112 12345 2
113 12345 3
我需要颠倒'VersionNo'列的顺序(所有其他列保持不变),如下所示:
VersionID DocumentID VersionNo
111 12345 3
112 12345 2
113 12345 1
我正在思考CTE和ROW_NUMBER()的问题但未能使其正常工作......
任何帮助都将受到高度赞赏。
由于
答案 0 :(得分:6)
试试这个:
SELECT VersionID, DocumentID, ROW_NUMBER() OVER(PARTITION BY DocumentID ORDER BY VersionID DESC) as VersionNo
FROM YOUR_TABLE
如果您需要更新表格,请使用:
;WITH CTE AS (
SELECT VersionID, DocumentID, ROW_NUMBER() OVER(PARTITION BY DocumentID ORDER BY VersionID DESC) as VersionNoNew
FROM YOUR_TABLE
)
UPDATE CTE
SET VersionNo = VersionNoNew
答案 1 :(得分:4)
SELECT VersionID
, DocumentID
, ROW_NUMBER()OVER(PARTITION BY DocumentID ORDER BY VersionID DESC) as VersionNo
FROM Version V
ORDER BY VersionID, DocumentID, VersionNo DESC
修改:如果您需要更新表格,请执行以下操作:
WITH V as(
SELECT VersionID
, DocumentID
, VersionNo
, ROW_NUMBER()OVER(PARTITION BY DocumentID ORDER BY VersionID DESC) as CalculatedVersionNum
FROM Version
)
UPDATE V
SET VersionNo=CalculatedVersionNum;
答案 2 :(得分:0)
当前答案未考虑版本号中的间隙或其他值。
无论值是什么,这都将颠倒版本号:
测试数据:
declare @t table(VersionID int, DocumentID int, VersionNo int)
insert @t
select 111,12345,1
union select 112,12345,2
union select 113,12345,4
更新
;with a as
(
select VersionID, DocumentID, VersionNo,
row_number() over (partition by documentid order by VersionID desc) rn1 ,
row_number() over (partition by documentid order by VersionID asc) rn2
from @t
)
update a
set versionno = b.versionno
from a
join a b on a.documentid = b.documentid and a.rn1 = b.rn2
select * from @t