프로그래밍/SQL, Hive, SAS 관련 정보

[SQL 기초] KEEP함수 (Oracle)

물박사의 저장공간 2025. 1. 19. 00:19

2025.02.24 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL] Table of Contents


저번 포스팅에서 말씀드린대로 KEEP은 특정 칼럼을 기준으로 정렬해서 최대/최소값을 갖는 행을 찾고, 찾아낸 행 안에 있는 다른 칼럼의 값을 활용하고자 할 때 사용합니다. Oracle에서만 사용할 수 있습니다. 다른 DBMS에서는 타 윈도우함수와 서브쿼리의 조합으로 작업을 수행해야 합니다. 
https://trillionver2.tistory.com/entry/Frequently-Used-Code-그룹별로-첫번째마지막-값-추출

 

오늘은 몇 가지 예시를 통해서 실제로 어떻게 사용하는지 살펴보도록 하겠습니다.  Employ 테이블이 아래와 같이 있다고 하겠습니다. 

역시 GPT의 도움을 좀 받았습니다.

 

 

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;