[펌글] ORACLE – MAX() KEEP() / MIN() KEEP() – 오라클

By | 7월 29, 2013

- 출처 : http://blog.naver.com/jazz1234k/40121360816 -

먼저 테스트용 데이터를 만들어보겠습니다.

   SELECT 1 A, 'AAB' B, 2224 C FROM DUAL
    UNION ALL
    SELECT 1 A, 'AAB' B, 2224 C FROM DUAL
    UNION ALL
    SELECT 1 A, 'AAC' B, 2224 C FROM DUAL
    UNION ALL
    SELECT 1 A, 'AAD' B, 2224 C FROM DUAL
    UNION ALL
    SELECT 1 A, 'AAA' B, 2222 C FROM DUAL
    UNION ALL
    SELECT 2 A, 'CCC' B, 2311 C FROM DUAL
    UNION ALL
    SELECT 2 A, 'ACC' B, 2355 C FROM DUAL
    UNION ALL
    SELECT 3 A, 'DDD' B, 3333 C FROM DUAL

A         B         C

----------------------

1       AAB      2224
1       AAB      2224
1       AAC      2224
1       AAD      2224
1       AAA      2222
2       CCC     2311
2       ACC     2355
3       DDD     3333

 

이 데이터를 A컬럼으로 GROUP BY 할겁니다. 근데 B컬럼의 MAX값을 구하려고 합니다. 그러면 일반적인 거죠?

SELECT A, MAX(B)

FROM ....

GROUP BY A

 

근데 MAX(B)를 구할때 다른 조건이 붙는 겁니다.

예를 들자면

C컬럼의 가장큰값중에서.. 라는 조건이 붙었습니다. 정리하자면

A컬럼으로 GROUP BY를 하는데 C컬럼의 가장 큰 값중에서 B컬럼의 MAX를 구하는 겁니다.

이것이 바로 MAX() KEEP() 입니다.

MAX(B) 를 구하는 거긴 한데 그전에 KEEP() 조건이 있습니다. C컬럼의 큰값중에서 B의 MAX

이렇게 씁니다.

MAX(B) KEEP(DENSE_RANK FIRST ORDER BY C DESC)

MAX(B)를 구하는데 C의 DESC 가장 큰값을 구해라

첫번째로 C값이 가장 큰값을 구하고

두번째로 B의 MAX값을 구합니다.

결과를 보면 이해가 빠르실겁니다.

 SELECT A, MAX(C), MAX(B),

             MAX(B) KEEP(DENSE_RANK FIRST ORDER BY C DESC),

             MIN(B) KEEP(DENSE_RANK FIRST ORDER BY C DESC)
FROM (
    SELECT 1 A, 'AAB' B, 2224 C FROM DUAL
    UNION ALL
    SELECT 1 A, 'AAB' B, 2224 C FROM DUAL
    UNION ALL
    SELECT 1 A, 'AAC' B, 2224 C FROM DUAL
    UNION ALL
    SELECT 1 A, 'AAD' B, 2224 C FROM DUAL
    UNION ALL
    SELECT 1 A, 'AAA' B, 2222 C FROM DUAL
    UNION ALL
    SELECT 2 A, 'CCC' B, 2311 C FROM DUAL
    UNION ALL
    SELECT 2 A, 'ACC' B, 2355 C FROM DUAL
    UNION ALL
    SELECT 3 A, 'DDD' B, 3333 C FROM DUAL
)
GROUP BY A

A   MAX(C)  MAX(B)  MAX(B)KEEP(DENSE_RANKFIRSTORDERBYCDESC)  MIN(B)KEEP(DENSE_RANKFIRSTORDERBYCDESC)

------------------------------------------------------------------------------------------------------------------------

1      2224        AAD                                     AAD                                                                     AAB
2      2355        CCC                                    ACC                                                                     ACC
3      3333        DDD                                     DDD                                                                     DDD

 

내용이 유용하셨다면 댓글을 남겨주세요~

Subscribe
Notify of
guest
2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
마계촌장
마계촌장
10 years ago

잘 보고 갑니다~
잘 지내고 계시죠?

호러블캣
10 years ago
Reply to  마계촌장

으앗 >, < 촌장님. 잘 지내시죠? 밥이나 함 묵어요~