2017-11-28 12 views
2

데이터베이스에 범주 필드가 업데이트되고 이전 값이 제거되지 않은 일부 항목이 있습니다. 내가 정의한 순서대로 항목을 "가장 높은"범주 값으로 유지하려고합니다.범주 값의 우선 순위를 지정하여 중복 제거

입력 :

id | degree 
============= 
1 | Diploma 
1 | Bachelors 
1 | Masters 
2 | Diploma 
2 | Bachelors 

출력 (원하는) :

id | degree 
============= 
1 | Masters 
2 | Bachelors 

나는 이전 값을 덮어 시도에서 마지막으로 "최고"값이 CASE를 사용하여 시도했지만 작동하지 않습니다 의도 한대로.

SELECT 
    DISTINCT id, 
    (CASE 
     WHEN id = 'Diploma' THEN 'Diploma' 
     WHEN id = 'Bachelors' THEN 'Bachelors' 
     WHEN id = 'Masters' THEN 'Masters' 
    END) as degree 
FROM 
    academic_record 

이 작업 방법이 있습니까?

+0

논리를 설명 할 수 있습니까? 마스터스> 학사> 디플로마를 의미한다고 가정하는 것이 맞습니까? – Mureinik

+1

맞습니다. 논리는 각 사례를 차례로 확인하고 사례가 참이면 값을 설정하는 것입니다. 다음 케이스는 값을 덮어 쓸 수 있습니다. (최적의 값은 아니지만 충분하지만, "대체 된"값을 덮어 쓸 필요없이 값을 설정하기 전에 모든 경우를 검사하는 것이 더 좋습니다. – yunque

답변

2

주문시 case을 사용하는 것이 좋습니다. 각 ID에 대해 rank을 쿼리 한 다음 상위 ID를 가져옵니다.

SELECT id, degree 
FROM (SELECT id, 
       degree, 
       RANK() OVER (PARTITION BY id 
          ORDER BY CASE degree WHEN 'Diploma' THEN 1 
               WHEN 'Bachelors' THEN 2 
               WHEN 'Masters' THEN 3 
            END DESC) AS rn 
     FROM academic_record) t 
WHERE rn = 1 
+0

아름답게 작동합니다! 고맙습니다. – yunque