오라클 분석함수 KEEP
형식
MAX(COL_A)|MIN(COL_A) KEEP(DENSE_RANK FIRST|LAST ORDER BY COL_B [ASC|DESC])
컬럼B를 기준으로 값을 정렬후 같은 레코드의 컬럼A값을 추출한다.
MAX값을 가져올때 다른컬럼이 기준값이 되어 그컬럼의 순서에 따른 MAX값을 가져와야 할때
MAX() KEEP()을 사용하면 한줄로 간단하게 표현할수 있다.
SELECT MAX(A)
FROM TMP
WHERE ROWNUM = 1
ORDER BY B
ROWNUM과 ORDER BY 를 사용하거나
다른 분석함수를 이용해서 순위를 뽑아낸후 다시 SELECT 해야하지만
SELECT
MAX(A) KEEP(DENSE_RANK FIRST ORDER BY B ASC)
FROM TMP
GROUP BY C
MAX KEEP을 사용하면 간단하게 표현이 가능하다.
EX) MAX(B)에 해당하는 C의값을 구하고 싶을때
WITH TMP AS (
SELECT 'A' A, 1 B , 2 C FROM DUAL UNION ALL
SELECT 'A' A, 2 B , 1 C FROM DUAL UNION ALL
SELECT 'B' A, 1 B , 2 C FROM DUAL UNION ALL
SELECT 'B' A, 2 B , 1 C FROM DUAL UNION ALL
SELECT 'C' A, 1 B , 3 C FROM DUAL UNION ALL
SELECT 'C' A, 2 B , 2 C FROM DUAL UNION ALL
SELECT 'C' A, 3 B , 1 C FROM DUAL
)
SELECT A
, MAX(B)
, MAX(C)
, MAX(C) KEEP(DENSE_RANK FIRST ORDER BY B DESC) AS MAX2
FROM TMP
GROUP BY A
결과:
A MAX(B) MAX(C) MAX2
--------------------
A 2 2 1
B 2 2 1
C 3 3 1
'Programming > Oracle' 카테고리의 다른 글
오라클 월별누적합계 구하기 (0) | 2015.12.01 |
---|---|
오라클 substr (0) | 2015.11.27 |
오라클 락 해제, ORACLE LOCK (0) | 2015.11.03 |
오라클 TIMESTAMP를 활용한 데이터복구 (0) | 2015.11.03 |
오라클에서 배열사용 (0) | 2015.11.03 |