반응형
오라클에서 KEEP 을 사용하면 그룹(GROUP) 내에서 최대, 최저 순위 행(값)을 가져올 수 있습니다.
최대, 최저 순위의 값을 구하는 건 쉽지만, 해당 순위의 행의 다른 컬럼 값을 가져와야 하는 경우 KEEP 을 사용하면 서브쿼리를 사용하지 않아도 값을 가져올 수 있습니다.
KEEP을 사용할 때는 GROUP BY 절로 그룹을 지정하거나 OVER 절로 구분해야 합니다.
KEEP 기본 사용 방법 (GROUP BY)
그룹을 지정하는 경우 사용
SELECT DEPTNO
, MAX(SAL) KEEP(DENSE_RANK LAST ORDER BY DEPTNO) AS SAL_LAST
, MAX(JOB) KEEP(DENSE_RANK LAST ORDER BY SAL) AS JOB_LAST
, MAX(ENAME) KEEP(DENSE_RANK LAST ORDER BY SAL) AS ENAME_LAST
FROM EMP B
GROUP BY DEPTNO
KEEP 기본 사용 방법 (OVER)
그룹을 지정하지 못하는 경우 사용
SELECT EMPNO
, JOB
, SAL
, MAX(SAL) KEEP(DENSE_RANK LAST ORDER BY SAL) OVER(PARTITION BY JOB) AS SAL_MAX
, MIN(SAL) KEEP(DENSE_RANK FIRST ORDER BY SAL) OVER(PARTITION BY JOB) AS SAL_MIN
FROM EMP B
ORDER BY JOB, SAL
KEEP (DENSE_RANK FIRST) - 최저 순위 값 가져오기
SELECT MAX(DNAME) KEEP(DENSE_RANK FIRST ORDER BY DEPTNO) AS DNAME_FIRST
, MAX(LOCATION) KEEP(DENSE_RANK FIRST ORDER BY DEPTNO) AS LOCATION_FIRST
FROM DEPT A
KEEP (DENSE_RANK LAST) - 최대 순위 값 가져오기
SELECT MAX(DNAME) KEEP(DENSE_RANK LAST ORDER BY DEPTNO) AS DNAME_LAST
, MAX(LOCATION) KEEP(DENSE_RANK LAST ORDER BY DEPTNO) AS LOCATION_LAST
FROM DEPT A
KEEP (DENSE_RANK) 를 사용할 때 최대, 최저 (FIRST, LAST) 및 정렬 순서 (ORDER BY) 를 확인해야 합니다.
이 부분을 헷갈리면 원하는 값이 반대로 도출될 수 있습니다.
MIN도 동일한 로직을 사용하므로 MIN 을 사용하면 MAX와 반대 값이 나오는 것이 아니므로 확인해서 사용해야 합니다.
그룹 함수 응용 (SUM, COUNT, AVG)
SELECT JOB
, MAX(SAL) KEEP(DENSE_RANK LAST ORDER BY SAL) AS SAL_MAX
, MIN(SAL) KEEP(DENSE_RANK LAST ORDER BY SAL) AS SAL_MIN
, SUM(SAL) KEEP(DENSE_RANK LAST ORDER BY SAL) AS SAL_SUM
, COUNT(SAL) KEEP(DENSE_RANK LAST ORDER BY SAL) AS SAL_COUNT
FROM EMP B
GROUP BY JOB
MAX, MIN 를 포함하여 그룹함수는 모두 KEEP 사용이 가능합니다.
반응형
'DataBase > Oracle' 카테고리의 다른 글
[Oracle] 오라클 날짜, 시간 형식(포맷) 총정리 / 구분자, 요일 (0) | 2025.09.10 |
---|---|
[Oracle] 오라클 상위, 하위 n개 행만 추출하는 방법 (0) | 2025.09.05 |
[Oracle] 오라클 스케줄러 잡(Scheduler Job) 실행 결과 확인 방법 / 스케줄 동작 로그 및 에러 확인 (0) | 2025.09.03 |
[Oracle] 오라클 LISTAGG 사용 방법 및 예제 (정렬, 중복제거, 컬럼 합치기/이어 붙이기) (1) | 2025.08.15 |
[Oracle] 오라클 사용자 계정별 권한 조회 방법 및 개념 (시스템, 객체, ROLE) (0) | 2025.08.15 |