[Oracle] 중복 데이터 하나만 남기고 제거 2가지 방법
- 데이터베이스/오라클
- 2022. 2. 16.
오라클에서 조회된 데이터에서 특정 칼럼을 기준으로 하나의 행만 조회해야 하는 경우가 있다. 중복된 칼럼의 데이터에서 그룹별로 최신의 행 하나만 가져오거나, 특정 칼럼으로 정렬하여 최상위 하나의 행만 조회할 때 아래의 2가지 방법을 사용할 수 있다. 아래의 방법은 행 전체를 중복 체크를 하여 제거하는 방법(DISTINCT)이 아니고 특정 칼럼을 기준으로 중복을 제거하는 방법이다.
그룹별로 순번을 지정하여 하나의 행만 추출
SELECT empno
, ename
, job
, hiredate
FROM (
SELECT empno
, ename
, job
, hiredate
, ROW_NUMBER() OVER(PARTITION BY job ORDER BY hiredate DESC) AS rn
FROM emp
)
WHERE rn = 1
ORDER BY job
ROW_NUMBER 함수를 사용하여 직군(job) 별 최근 입사일자(hiredate) 순으로 순번을 부여한 후, 해당 데이터를 인라인 뷰로 사용하여 직군별 첫 번째 순번(rn=1)만 조회하는 방법이다.
위의 방법을 사용하면 GROUP BY 절이나 DISTINCT 키워드를 사용하지 않고도 특정 칼럼을 그룹으로 하나의 데이터만 조회를 할 수 있다.
그룹별로 MAX에 해당하는 행만 추출
SELECT a.empno
, a.ename
, a.job
, a.hiredate
FROM emp a
WHERE a.hiredate = (SELECT MAX(aa.hiredate)
FROM emp aa
WHERE aa.job = a.job)
ORDER BY a.job
위의 예제는 직군(job) 별로 최근 입사일자(hiredate)를 조회하여 해당 직군의 가장 최근 입사일자에 해당하는 사원만 조회하는 방법이다. 직군별로 최근 입사일자가 동일한 사원이 존재한다면 2명 이상이 조회될 수도 있다.
그룹별로 MAX 값을 가져올 때 조인 칼럼(aa.job)에 인덱스가 존재하지 않는다면 속도가 느려질 수 있으니, 데이터가 많은 테이블인 경우 해당 칼럼에 인덱스가 존재하는지 미리 확인하는 것이 좋다.
▼ DISTINCT, GROUP BY 절을 사용하는 단순 중복제거 방법은 아래를 참고하면 된다.