[SQL 기초] KEEP함수 (Oracle)
2025.02.24 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL] Table of Contents
저번 포스팅에서 말씀드린대로 KEEP은 특정 칼럼을 기준으로 정렬해서 최대/최소값을 갖는 행을 찾고, 찾아낸 행 안에 있는 다른 칼럼의 값을 활용하고자 할 때 사용합니다. Oracle에서만 사용할 수 있습니다. 다른 DBMS에서는 타 윈도우함수와 서브쿼리의 조합으로 작업을 수행해야 합니다.
https://trillionver2.tistory.com/entry/Frequently-Used-Code-그룹별로-첫번째마지막-값-추출
오늘은 몇 가지 예시를 통해서 실제로 어떻게 사용하는지 살펴보도록 하겠습니다. Employ 테이블이 아래와 같이 있다고 하겠습니다.
1. Group by와 함께 사용
예) 각 부서(DEPT_ID)에서 가장 높은 급여를 받는 직원의 이름을 반환.
SELECT
DEPT_ID,
MAX(EMP_NAME) KEEP (DENSE_RANK FIRST ORDER BY SALARY DESC) AS TOP_EMPLOYEE,
MAX(SALARY) AS TOP_SALARY
FROM EMPLOYEE
GROUP BY DEPT_ID;
2. Over (partition)과 함께 사용
예) 각 부서(DEPT_ID)에서 가장 낮은 급여를 받는 직원의 이름과 급여를 모든 직원 정보 옆에 표시.
SELECT
DEPT_ID,
EMP_NAME,
SALARY,
MIN(EMP_NAME) KEEP (DENSE_RANK FIRST ORDER BY SALARY ASC)
OVER (PARTITION BY DEPT_ID) AS LOWEST_EMPLOYEE,
MIN(SALARY)
OVER (PARTITION BY DEPT_ID) AS LOWEST_SALARY
FROM EMPLOYEE;
3. Keep만 사용
예) 전체 데이터에서 가장 높은 급여를 받는 직원의 이름과 급여 반환.
SELECT
MAX(EMP_NAME) KEEP (DENSE_RANK FIRST ORDER BY SALARY DESC) AS HIGHEST_EMPLOYEE,
MAX(SALARY) AS HIGHEST_SALARY
FROM EMPLOYEE;
세번째 예시의 경우에는 Hackerrank의 문제와도 연결될 수 있을 것 같습니다.
https://www.hackerrank.com/challenges/weather-observation-station-5/problem?isFullScreen=true
Weather Observation Station 5 | HackerRank
Write a query to print the shortest and longest length city name along with the length of the city names.
www.hackerrank.com
SELECT MIN(CITY) KEEP (DENSE_RANK first ORDER BY LENGTH(city)) city
, MIN(LENGTH(city)) KEEP (DENSE_RANK first ORDER by LENGTH(city)) leng
FROM station
UNION ALL
SELECT MIN(CITY) KEEP (DENSE_RANK last ORDER BY LENGTH(city)) city
, MAX(LENGTH(city)) KEEP (DENSE_RANK last ORDER BY LENGTH(city), CITY) leng
FROM station;