[Oracle] SELECT절에서 중복된 값 한번만 표시 방법
- 데이터베이스/오라클
- 2024. 5. 25.
오라클 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 함수인 경우 칼럼의 값이 동일할 경우 동일한 순번이 발생할 수 있어서 추천하지는 않는다.
위의 예제는 서브쿼리를 한번 사용해서 중복값을 제거하기 때문에 조금 복잡해 보이지만 상황에 따라서 위의 방법이 조금 더 효과적일 때가 있으니 숙지하고 있으면 많은 도움이 될 것이다.