개요
우선 이 구문은 그룹별 최상위 데이터를 조회해야 할 때 사용하는 구문인데, 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 |
---|