본문으로 바로가기

그룹함수를 조회시 다른 필드를 참조하여 조회시 KEEP 을 사용 할 수 있습니다.

 

예를들어 CLASS 를 그룹으로 같은 그룹내의 가장 큰 급여를 받는 사람을 구하기 위해선

 

CLASS 를 그룹으로 묶고 급여에 MAX를 주면 됩니다.

WITH A AS (
SELECT 
    LEVEL AS NUM,
    LEVEL * 1000 AS PAY,
    CASE WHEN MOD(LEVEL,2) = 0 THEN 1 ELSE 2 END AS JOINDAY,
    CASE WHEN LEVEL <5 THEN 'A' ELSE 'B' END AS CLASS
    
FROM DUAL 
CONNECT BY LEVEL <9
)

SELECT CLASS,MAX(PAY) FROM A GROUP BY CLASS;

테이블없이 만든 간단한 데이터셋
결과

 

하지만 위의 조건에 JOINDAY 가 큰 경우에 대한 조건이 추가되었을경우 KEEP 을 사용하여 조회할수있습니다.

WITH A AS (
SELECT 
    LEVEL AS NUM,
    LEVEL * 1000 AS PAY,
    CASE WHEN MOD(LEVEL,2) = 0 THEN 1 ELSE 2 END AS JOINDAY,
    CASE WHEN LEVEL <5 THEN 'A' ELSE 'B' END AS CLASS
    
FROM DUAL 
CONNECT BY LEVEL <9
)

SELECT CLASS,MAX(PAY)KEEP(DENSE_RANK LAST ORDER BY JOINDAY) AS PAY FROM A GROUP BY CLASS;

 

반대로 JOINDAY 가 작은경우를 원한다면 KEEP 절의 LAST 를 FIRST 로 바꿔주면 됩니다.

WITH A AS (
SELECT 
    LEVEL AS NUM,
    LEVEL * 1000 AS PAY,
    CASE WHEN MOD(LEVEL,2) = 0 THEN 1 ELSE 2 END AS JOINDAY,
    CASE WHEN LEVEL <5 THEN 'A' ELSE 'B' END AS CLASS
    
FROM DUAL 
CONNECT BY LEVEL <9
)

SELECT CLASS,MAX(PAY)KEEP(DENSE_RANK FIRST ORDER BY JOINDAY) AS PAY FROM A GROUP BY CLASS;

 

KEEP 절의 ORDER BY 절의 정렬 순서에따라 FIRST 와 LAST 의 결과가 달라질수 있으니 주의