[Oracle] SELECT절에서 중복된 값 한번만 표시 방법

오라클 SQL에서 SELECT 된 값에서 이전 행의 값과 동일한 경우 중복된 값(반복값)을 NULL로 숨김처리하여 제거를 해야 하는 상황이 종종 발생한다. 대부분 애플리케이션 단에서 처리하면 쉽게 해결되지만, 쿼리문에서 여러 행의 중복된 값을 한 번만 표시하기 위해서는 분석함수(LAG, ROW_NUMBER)를 사용하면 해결할 수 있다. 이 외에도 다양한 방법이 있을 수 있지만 아래의 예시를 이해하면 많은 도움이 될 것이다.

 

중복된 값 한번만 표시

목차

 

LAG 함수를 사용하여 중복 제거

SELECT NULLIF(job, LAG(job) OVER(ORDER BY job)) AS job
     , empno
     , ename
  FROM emp
 WHERE job IN ('ANALYST', 'MANAGER', 'SALESMAN')

 

 

LAG 함수는 이전 행의 값을 가져올 수 있으며, NULLIF 함수를 사용하여 현재 행의 값과 LAG 함수로 추출한 이전 행의 값을 비교하여 동일한 값이면 NULL로 표시한다.

 

LAG 함수는 분석함수이고 OVER 절과 함께 사용하며, NULLIF 함수는 평소에는 잘 사용하지 않지만 동일한 값을 NULL로 치환할 수 있어서 위의 예시에서는 유용하게 사용할 수 있다.

 

SELECT NULLIF(job, LAG(job) OVER(ORDER BY job, empno)) AS job
     , empno
     , ename
  FROM emp
 WHERE job IN ('ANALYST', 'MANAGER', 'SALESMAN')

 

 

조회된 데이터를 조금 더 세부적으로 정렬하기 위해서는 LAG 함수의 ORDER BY에 중복제거 칼럼(job) 뒤에 추가로 정렬할 칼럼을 추가하면 된다.

 

분석함수(LAG)에서 ORDER BY를 사용하면 SELECT 된 데이터 전체가 분석함수의 정렬 조건으로 정렬된다.

 

ROW_NUMBER 함수를 사용하여 중복 제거

SELECT CASE WHEN job_num = 1 THEN job END AS job
     , empno
     , ename
  FROM (
         SELECT job
              , empno
              , ename
              , ROW_NUMBER() OVER(PARTITION BY job ORDER BY job, empno) AS job_num
           FROM emp
          WHERE job IN ('ANALYST', 'MANAGER', 'SALESMAN')
       )

 

 

ROW_NUMBER 함수를 사용하여 그룹별로 순번을 매겨서 그룹별 첫 번째 행만 특정 값을 표시할 수 있다. ROW_NUMBER 함수도 분석함수이며 OVER 절과 함께 사용한다. ROW_NUMBER 함수 외에 RANK 함수를 사용할 수도 있지만 RANK 함수인 경우 칼럼의 값이 동일할 경우 동일한 순번이 발생할 수 있어서 추천하지는 않는다.

 

위의 예제는 서브쿼리를 한번 사용해서 중복값을 제거하기 때문에 조금 복잡해 보이지만 상황에 따라서 위의 방법이 조금 더 효과적일 때가 있으니 숙지하고 있으면 많은 도움이 될 것이다.

예제쿼리(테이블포함).txt
0.00MB

 

[Oracle] 중복 데이터 하나만 남기고 제거 2가지 방법

오라클에서 조회된 데이터에서 특정 칼럼을 기준으로 하나의 행만 조회해야 하는 경우가 있다. 중복된 칼럼의 데이터에서 그룹별로 최신의 행 하나만 가져오거나, 특정 칼럼으로 정렬하여 최상

gent.tistory.com

 

[Oracle] 오라클 LAG, LEAD 함수 사용법 (이전값, 다음값)

오라클에서 이전 행의 값을 찾거나 다음 행의 값을 찾기 위해서는 LAG, LEAD 함수를 사용하면 된다. LAG(expr [,offset] [,default]) OVER([partition_by_clause] order_by_clause) LEAD(expr [,offset] [,default]) OVER([partition_by_c

gent.tistory.com

 

[Oracle] NULLIF 함수 사용법 (특정 값을 NULL로 변환)

오라클에서 특정 값인 경우 NULL로 치환하기 위해서는 NULLIF 함수를 사용하면 된다. NVL 함수와 조금 반대되는 함수라고 생각하면 된다. NVL 함수는 NULL인 경우 특정 값으로 치환을 하고, NULLIF 함수

gent.tistory.com

 

[Oracle] 오라클 분석함수 사용법 정리 (OVER, PARTITION BY)

오라클에서 분석함수를 사용할 때 PARTITION BY를 사용하여 그룹으로 묶어서 연산을 할 수 있다. GROUP BY 절을 사용하지 않고, 조회된 각 행에 그룹으로 집계된 값을 표시할 때 OVER 절과 함께 PARTITION B

gent.tistory.com

 

 

댓글

Designed by JB FACTORY