T-SQL重新排序表中的行

时间:2012-04-10 11:17:44

标签: sql sql-server-2008 tsql

如果这是一个重复的问题,请提前解决,我没有注意到:(

我有一张表格如下:

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()的问题但未能使其正常工作......

任何帮助都将受到高度赞赏。

由于

3 个答案:

答案 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