그룹함수를 조회시 다른 필드를 참조하여 조회시 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 의 결과가 달라질수 있으니 주의
'DB\SQL' 카테고리의 다른 글
[Oracle] 오라클 절대값 구하기(ABS) (0) | 2020.05.29 |
---|---|
[Oracle] 오라클 컬럼추가,수정,삭제,코멘트달기 (0) | 2020.05.26 |
[Oracle] 오라클 줄바꿈,개행 처리 (CHR(13),CHR(10)) (2) | 2020.05.20 |
[Oracle] 오라클 문자와 아스키코드 변환(CHR,ASCII) (0) | 2020.05.18 |
[Oracle] 오라클 몫,나머지 구하기 (/, MOD) (0) | 2019.11.21 |