2017-04-02 4 views
1

각 테스트에 대해 처음 두 항목이있는 시나리오가 있습니다. 각 테스트의 의미는 두 가지입니다. 이제 테스트 순위를 비교하고 내 테이블의 LoginID 열을 업데이트하고 싶습니다.열 값을 비교하고 Oracle의 다른 열을 업데이트하십시오.

샘플 데이터 : 상기 표에서

RANK | TestID | LoginID 
-----+--------+--------- 
234  14  null 
235  14  null 
330  15  null 
331  15  null 
223  18  null 
222  18  null 
500  20  null 
501  20  null 

, 이제 I가 1과 2로 LoginId 열을 해당 TESTIDRANK 열을 비교하고, 갱신 할 필요가 각각 testId 두 항목이 . 다음과 같은

마지막으로 내가 출력을 찾고 :

RANK | TestID | LoginID 
-----+--------+--------- 
234  14  1 
235  14  2 
330  15  1 
331  15  2 
223  18  2 
222  18  1 
500  20  1 
501  20  2 

수 누구든지 이것을 달성하는 더 좋은 방법이라고 제안합니까? 나는 min()max()이라는 개념으로 시도했는데, 개념은 Case (When /then)이지만 예상되는 결과를 반환하지는 않습니다.

답변

2

당신은 윈도우 함수 row_numberMERGE를 사용할 수 있습니다

merge into your_table t 
using (
    select t.*, 
     row_number() over (partition by testId order by rank) as rn 
    from your_table t 
) s on (
    t.rank = s.rank 
    and t.testId = s.testId 
    ) 
when matched then update set t.loginId = s.rn; 
1

이 시도 :

UPDATE 
yourTable T, 
(
    SELECT 
     TestID 
     ,MIN(RANK) AS firstRank 
     ,MAX(RANK) AS secondRank 
    FROM 
     yourTable 
    GROUP BY 
     TestID 
) A 
SET RANK = 
    CASE WHEN RANK = A.firstRank THEN 1 
     WHEN RANK = A.secondRank THEN 2 
     END 
관련 문제