이미지09
Coding Story/DATABASE

[ Oracle ] 오라클 중복데이터 처리, 중복데이터 한번만

반응형

 

 

중복 데이터를 처리하는 방법은 다양하다.

중복 데이터를 처리하는 방법에는 어떤것들이 있는지 살펴보자.

 

만약 아래와 같은 정렬되지 않은 의류 테이블이 존재한다고 가정하자.

 

[ 의류 ] 테이블

 

 

위 데이터를 보면 No2 ROW 와 No5 ROW 가 중복되는 데이터임을 알 수 있다.

중복데이터를 제거하고 싶다면 흔히 알고 있는 DISTINCT를 사용하면 된다.

SELECT DISTINCT 분류명, 색상명, 가격, 상품번호
FROM 의류 ;

 

 

그럼 아래와 같은 결과가 나올것이다.

 

 

이처럼 DISTINCT는 데이터가 모두 동일한 ROW가 존재할경우 이를 제거해준다.

그렇다면 중복데이터를 제거하는 것이 아닌 공백이나 널로 처리해 해당데이터가 하나만 보이게하려면 어떻게 해야할까?

 

 

필자의 경우 서브쿼리를 사용하였는데 서브쿼리부분부터 보자.

SELECT DISTINCT 
     , 분류명
     , 색상명
     , 가격
     , 상품번호
     , RANK() OVER ( PARTITION BY 분류명 ORDER BY 상품번호 ) AS RANK
  FROM 의류 ;

 

06번 행 설명

 

RANK() OVER ( PARTITION BY 분류명 ORDER BY 상품번호 ) AS RANK

 

① 분류명 컬럼을 기준으로 데이터를 나누고 => PARTITION BY 분류명

② 상품번호를 기준으로 정렬 => ORDER BY 상품번호

③ 정렬 후 각 나누어진 데이터마다 순위를 매김 => RANK() OVER

 

 

위 쿼리를 수행하면 아래와 같은 데이터가 만들어진다.

 

 

이 쿼리를 서브쿼리 ( FROM절 ) 에 사용하고 CASE문을 걸어보았다.

SELECT ( CASE WHEN RANK = 1 THEN 분류명 ELSE ' ' END ) AS 분류명
                                                        , 색상명
                                                        , 가격
                                                        , 상품번호
  FROM ( 
       SELECT DISTINCT 
            , 분류명
            , 색상명
            , 가격
            , 상품번호
            , RANK() OVER ( PARTITION BY 분류명 ORDER BY 상품번호 ) AS RANK
        FROM 의류 
       ) ; 

 

01번 행 설명

 

SELECT ( CASE WHEN RANK = 1 THEN 분류명 ELSE ' ' END ) AS 분류명

 

- RANK가 1이면 분류명 데이터를, 아니면 공백으로 바꿔 조회한다.

 

 

그럼 이 쿼리의 결과는?

 

 

원한대로 결과가 아주 잘 나왔다.

지금껏 중복데이터를 처리하는 방법들에 대해 알아보았다.

 

 

 

 

반응형