2

如果这是一个重复的问题,请提前道歉,我没有查到:(

我有一个看起来像的表:

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() OVER 的思路,但无法让它正常工作......

任何帮助将不胜感激。

谢谢

4

3 回答 3

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 
于 2012-04-10T11:21:40.887 回答
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;
于 2012-04-10T11:22:53.663 回答
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
于 2012-04-10T12:59:17.513 回答