2012-04-10 81 views
2

Apolgoies提前如果這是一個重複的問題,我無法查找:(T-SQL重新排序行

我有一個表,看起來像:

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

是否要更新這個表? – 2012-04-10 11:21:06

+0

你好,是的,我想更新同一張表,謝謝 – user1024008 2012-04-10 11:22:32

+0

似乎將這個概念化的方式就像兩張表;一個版本號降序,一個版本號升序。然後,只需將Version No複製到具有VersionID升序的版本中。 – 2012-04-10 11:23:19

回答

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 
+2

+1:這將顛倒順序。這也意味着任何具有正確順序的組織都會顛倒過來併成爲錯誤的順序。也許(取決於OP可能需要什麼)使用'OVER(PARTITION BY DocumentID ORDER BY VersionID DESC)'是合適的嗎?爲確保新的VersionNo始終與VersionID的順序相反? ***另外***,你可以直接在CTE上進行更新,而無需進行連接。 'UPDATE cte SET VersionNo = NewVesionNo' *(在哪裏調用新字段NewVersionNo)* – MatBailie 2012-04-10 11:28:32

+0

好注意,Dems!謝謝 – 2012-04-10 11:29:56

+0

謝謝堆Dems! :)這看起來像我之後。將很快測試並讓你知道。再次感謝:) – user1024008 2012-04-10 11:36:07

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; 
+1

+1:編輯現在完全匹配我也評論了其他答案:) * [除了你可能需要給VersionNo一個不同的別名?我不確定是否重新使用相同的名稱會掩蓋更新中的原始字段。我從來沒有嘗試過,但沒有在CTE中使用不同的名稱(如NewVersionNo)。] * – MatBailie 2012-04-10 11:31:48

+0

您好,非常感謝您的幫助。它的工作完美:) – user1024008 2012-04-10 14:40:57

0

當前的答案沒有考慮到版本號缺口或其他值。

這將扭轉的versionNo無論什麼值是:

測試數據:

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