본문 바로가기
데이터베이스/Oracle

[Oracle]MAX KEEP DENSE_RANK 으로 그룹별 최상위(MAX) 데이터 출력

by ordinary_daisy 2023. 8. 29.

개요

 

우선 이 구문은 그룹별 최상위 데이터를 조회해야 할 때 사용하는 구문인데, SQLP 공부하다가 알게 됐습니다.
실무에서 Oracle을 써보질 않았으니 너무 생소했고, 머릿속에 정말 남지 않더라구요.
이럴땐 실습하며 이해하는게 답인 것 같아 실습을 바로 진행해봤습니다.

 


MAX()KEEP(DENSE_RANK) 실습

 

역시 실습은 EMP 테이블이 국룰이죠

우선 전체 데이터를 조회해봅니다.

SELECT * 
FROM EMP;


부서번호별 급여가 가장 높은 직원의 정보 조회

부서번호(DEPTNO)별 급여가 가장 높은 직원의 정보(이름,직업,급여)를 알고 싶을 때 아래와 같이 MAX KEEP 구문을 사용해 조회해줍니다.

SELECT DEPTNO,
        MAX(ENAME)KEEP(DENSE_RANK FIRST ORDER BY SAL DESC) ENAME,
        MAX(JOB)KEEP(DENSE_RANK FIRST ORDER BY SAL DESC) JOB,
        MAX(SAL)KEEP(DENSE_RANK FIRST ORDER BY SAL DESC) MAX_SAL
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO
;


ROW_NUMBER()OVER() 구문으로 대체

데이터 검증은 ROW_NUMBER()OVER() 구문을 사용하여 확인해볼까요?

DEPTNO별로 급여 순위를 매기기 위해 그룹화 기준엔 "PARTITION BY DEPTNO"를 작성하고, 정렬 기준엔 "ORDER BY SAL DESC"를 작성해주면 됩니다.

출력된 결과에서 SAL_RANK =1 행들을 보면 MAX KEEP 구문 쿼리문과 동일하다는 것을 볼 수 있네요

SELECT *
FROM (
        SELECT DEPTNO,
            ENAME,
            JOB,
            SAL,
            ROW_NUMBER()OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS SAL_RANK
        FROM EMP
)
--WHERE SAL_RANK =1		--이 주석을 해제하면 MAX()KEEP(DENSE_RANK) 구문과 동일한 결과를 얻을 수 있음
ORDER BY SAL_RANK,DEPTNO
;

위 쿼리문에서 WHERE절 주석을 풀어주면 MAX KEEP 구문과 동일한 결과를 얻을 수 있으나,
상대적으로 쿼리문이 길어진다는 점 참고 해주시면 됩니다.


구문 사용 예시

 

프로그래머스 문제 중에 구문을 사용하기 좋은 문제가 있어서 제가 풀이한 글도 같이 보시면 좋을 것 같네요

프로그래머스 문제-식품분류별 가장 비싼 식품의 정보 조회하기

'데이터베이스 > Oracle' 카테고리의 다른 글

[Oracle] 자주 사용하는 힌트 목록  (2) 2024.01.28