예를 들어, SOME_TABLE 테이블 안에 SEQNO, CNT 컬럼이 있다.

SEQNO 컬럼은 기본 키이고, CNT 컬럼은 중복된 값이 올 수 있으며 숫자만 취급한다.

 

여기서 CNT가 제일 큰 값을 찾으려면 아래와 같이 작성할 수 있을 것이다.

SELECT
    MAX(CNT)
FROM
    SOME_TABLE

근데 여기서 CNT가 제일 큰 값의 레코드 중에 다른 컬럼의 데이터를 가져오고 싶은 경우가 있다.

그렇다면 아래와 같이 작성할 수도 있을 것이다.

SELECT
    SEQNO,
    CNT
FROM
    SOME_TABLE
WHERE
    CNT = (
        SELECT
            MAX(CNT)
        FROM
            SOME_TABLE
    )
    AND romnum = 1

근데 위와 같이 작성하지 않아도 Oracle 에서는 아래처럼 쉽게 가져올 수 있는 문법이 있다.

SELECT
    -- 제일 큰 값
    MAX(seqno) KEEP (DENSE_RANK FIRST ORDER BY cnt DESC)
    -- 제일 작은 값
    MIN(seqno) KEEP (DENSE_RANK LAST ORDER BY cnt DESC)
FROM
    some_table

EXPLAIN PLAN을 했을 때 COST를 따져보면 위와 같이 작성하는 것이 오히려 성능적으로 좋은 경우가 있다.