2012-04-10 6 views
2

Apolgoiesこれは私が:(T-SQLの再注文列テーブルに予め

私がどのように見えるのテーブルを持っているの検索に失敗した繰り返し質問、ある場合:

VersionID DocumentID VersionNo 
111  12345   1 
112  12345   2 
113  12345   3 

I OVERではなく、それを得ることができた

VersionID DocumentID VersionNo 
111  12345   3 
112  12345   2 
113  12345   1 

私はCTEとROW_NUMBER(の線に沿って考えていた):「VersionNoの」列の順序を逆にする必要があるのフォローとして(他のすべての列は変更されません)正しく動作するように...

ご協力いただければ幸いです。

おかげ

+0

あなたは、この表を更新しますか? –

+0

こんにちはティム、はい私は同じテーブルを更新したい、ありがとう – user1024008

+0

これを概念化する方法のように見える2つのテーブルです。 1つはバージョン番号の降順で、もう1つはバージョンIDの昇順です。次に、バージョン番号を昇順にコピーするだけでバージョン番号をコピーします。 –

答えて

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:これは順序を逆転させます。これはまた、正しい順序を持つグループがすでに逆転して誤った順序になることを意味します。 OVER(DocumentID ORDER BY VersionID DESC)を使用しておそらく(OPが必要とするものによって)適切であろうか?新しいVersionNoが常にバージョンIDとは逆の順序になるようにするには? ***また***、あなたはちょうど結合を行うことなく、CTEの上で直接UPDATEを行うことができます。 'UPDATE cte SET VersionNo = NewVesionNo' *(新しいフィールドNewVersionNoをどこに呼び出すか)* – MatBailie

+0

良いメモ、デモ!おかげで –

+0

Thanks heaps Dems! :)これは私が何をしたかのように見えます。これを直ちにテストしてお知らせします。もう一度ありがとう:) – user1024008

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:私はまた、他の答えにコメントしたものと正確に一致する編集:) * [あなたは、バージョン番号を別の別名を与える必要がありますか?私は同じ名前を再使用すると元のフィールドを更新から隠すかどうか分からない。私はCTE(NewVersionNoなど)で別の名前を使用せずに試したことはありません。] * – MatBailie

+0

こんにちはTimさん、多くのご協力ありがとうございます。それは完璧に働いた:) – user1024008

0

現在の回答では、versionnoのギャップやその他の値を考慮していません。

テストデータ:

これは値が何であるかに関係なく、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