T-SQL重新排序表中的行

use*_*008 2 sql t-sql sql-server-2008

如果这是一个重复的问题,我提前给了Apolgoies,我没有查找:(

我有一张表看起来像:

VersionID DocumentID VersionNo
111       12345         1
112       12345         2
113       12345         3
Run Code Online (Sandbox Code Playgroud)

我需要颠倒'VersionNo'列的顺序(所有其他列保持不变)如下:

VersionID DocumentID VersionNo
111       12345         3
112       12345         2
113       12345         1
Run Code Online (Sandbox Code Playgroud)

我正在考虑CTE和ROW_NUMBER()OVER,但未能使其正常工作......

任何帮助将受到高度赞赏.

谢谢

And*_*nov 6

试试这个:

SELECT VersionID, DocumentID, ROW_NUMBER() OVER(PARTITION BY DocumentID ORDER BY VersionID DESC) as VersionNo 
FROM YOUR_TABLE
Run Code Online (Sandbox Code Playgroud)

如果您需要更新表,请使用以下命令:

;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 
Run Code Online (Sandbox Code Playgroud)

  • +1:这将颠倒顺序.这也意味着任何具有正确顺序的组都将被颠倒并成为错误的顺序.也许(取决于OP可能需要什么)使用`OVER(PARIDTION BY DocumentID ORDER BY VersionID DESC)`是否合适?要确保新VersionNo始终与VersionID的顺序相反?***同样***,您可以直接在CTE上进行更新,而无需进行连接.`UPDATE cte SET VersionNo = NewVesionNo`*(在哪里调用新字段NewVersionNo)* (2认同)