2012-04-10 5 views
2

Apolgoies이 내가 :(T-SQL 다시 주문 행 사전에

내가 좋아 보이는 테이블이 조회하는 데 실패 반복되는 질문 인 경우 :

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

내가 OVER하지만 그것을 얻을 수 있었다

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

나는 CTE와 ROW_NUMBER (의 라인을 따라 생각하고 있었다) 다음 'VersionNo'컬럼의 순서를 반대로 필요에 다음과 같이 (다른 모든 열은 변경되지 않습니다) 올바르게 작동하려면 ...

도움을 주시면 감사하겠습니다.

감사

+0

이 테이블을 업데이트 하시겠습니까? –

+0

안녕하세요, Tim 예, 동일한 테이블을 업데이트하고 싶습니다. 감사합니다. – user1024008

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

+1 : 주문을 취소합니다. 또한 올바른 주문을 가진 그룹이 이미 취소되어 잘못된 주문이 될 수 있음을 의미합니다. OVER (DocumentID ORDER BY VersionID DESC)를 사용하여 (OP가 필요할 수도있는) 아마도 아마도 적절한가? 새로운 VersionNo가 항상 VersionID와 반대 순서로되어 있는지 확인하려면? *** 또한 ***, 당신은 가입을하지 않고도 CTE에서 직접 UPDATE를 할 수 있습니다. UPDATE cte SET VersionNo = NewVesionNo' * (새 필드 NewVersionNo를 호출하는 곳) * – MatBailie

+0

좋은 메모, Dems! 감사합니다 –

+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

안녕하세요, 많은 도움을 주셔서 감사합니다. 그것은 완벽하게 일했습니다 :) – 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