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

現在の回答では、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
于 2012-04-10T12:59:17.513 に答える