오라클 FIRST, LAST 함수

문법

집계함수(분석함수)
KEEP
(DENSE_RANK FIRST ORDER BY
expr [ DESC | ASC ]
[ NULLS { FIRST | LAST } ]
[, expr [ DESC | ASC ]
[ NULLS { FIRST | LAST } ]
]…
)
[ OVER ( [query_partition_clause] ) ]

오라클에서 지원하는 FIRST, LAST 함수에 대해 알아보자.

-- LAST 함수는 ORDER BY 에 의해 정렬된 컬럼값 중 마지막 컬럼값을 (MAX 값을 가져오는 게 아님)
-- FIRST 함수는 첫번째 컬럼값을 가져온다.
-- 아래 경우는 파티션은 GUBUN 컬럼으로 하고, SEQ 컬럼으로 정렬하여 첫번째 및 마지막 VALUE를 가져온다.
-- 부연설명 : GUBUN을 파티션으로 하여, LAST인 경우 각각 SEQ = 10, SEQ = 4인 경우의 VALUE 값을 가져옴
-- 참고사항1 : 이 경우 LAST / FIRST 함수는 OVER절과 같이 쓰여 분석함수로서 기능했다.
-- 참고사항2 : 분석함수로 사용된 MAX, MIN, SUM, AVG는 종류에 관계없이 첫번째/마지막 값을 가져오므로 결과는 서로 동일하다.

WITH TMP AS (
SELECT 10 SEQ, 'A' GUBUN, 40 VALUE FROM DUAL UNION ALL
SELECT 8 SEQ, 'A' GUBUN, 20 VALUE FROM DUAL UNION ALL
SELECT 6 SEQ, 'A' GUBUN, 30 VALUE FROM DUAL UNION ALL
SELECT 4 SEQ, 'B' GUBUN, 45 VALUE FROM DUAL UNION ALL
SELECT 3 SEQ, 'B' GUBUN, 70 VALUE FROM DUAL UNION ALL
SELECT 2 SEQ, 'B' GUBUN, 71 VALUE FROM DUAL
)
SELECT SEQ, GUBUN, VALUE
, MAX(VALUE) KEEP(DENSE_RANK LAST ORDER BY SEQ) OVER(PARTITION BY GUBUN) LAST_VALUE1
, MIN(VALUE) KEEP(DENSE_RANK LAST ORDER BY SEQ) OVER(PARTITION BY GUBUN) LAST_VALUE2
, SUM(VALUE) KEEP(DENSE_RANK LAST ORDER BY SEQ) OVER(PARTITION BY GUBUN) LAST_VALUE3
, AVG(VALUE) KEEP(DENSE_RANK LAST ORDER BY SEQ) OVER(PARTITION BY GUBUN) LAST_VALUE4
, MAX(VALUE) KEEP(DENSE_RANK FIRST ORDER BY SEQ) OVER(PARTITION BY GUBUN) FIRST_VALUE1
, MIN(VALUE) KEEP(DENSE_RANK FIRST ORDER BY SEQ) OVER(PARTITION BY GUBUN) FIRST_VALUE2
, SUM(VALUE) KEEP(DENSE_RANK FIRST ORDER BY SEQ) OVER(PARTITION BY GUBUN) FIRST_VALUE3
, AVG(VALUE) KEEP(DENSE_RANK FIRST ORDER BY SEQ) OVER(PARTITION BY GUBUN) FIRST_VALUE4
FROM TMP;

SEQ GUBUN VALUE LAST_VALUE1 LAST_VALUE2 LAST_VALUE3 LAST_VALUE4 FIRST_VALUE1 FIRST_VALUE2 FIRST_VALUE3 FIRST_VALUE4

10 A 40 40 40 40 40 30 30 30 30
8 A 20 40 40 40 40 30 30 30 30
6 A 30 40 40 40 40 30 30 30 30
4 B 45 45 45 45 45 71 71 71 71
3 B 70 45 45 45 45 71 71 71 71
2 B 71 45 45 45 45 71 71 71 71




-- 아래는 FIRST / LAST 함수가 집계함수로서 기능했다.
-- 집계함수로서 기능할 경우 GROUP BY 절을 반드시 명시해야 한다.
-- MAX/MIN 값과 FIRST / LAST 함수값이 서로 다른 것을 확인 할 수 있다.
-- FIRST / LAST 함수는 앞에 기술된 집계함수가 무엇인지 중요하지 않으며, 
-- ORRDER BY 한 이후,  첫 번째 컬럼이냐, 마지막 컬럼이냐가 중요할 뿐이다.
-- 아래 LAST 경우 SEQ로 정렬하면 GUBUN별 마지막 컬럼은 SEQ = 10, 4 이다.
-- 아래 FIRST 경우 SEQ로 정렬하면 GUBUN별 첫번째 컬럼은 SEQ = 6, 2 이다.
-- 그러므로 첫번째 값과 마지막 값만 출력한다.
WITH TMP AS (
SELECT 10 SEQ, 'A' GUBUN, 40 VALUE FROM DUAL UNION ALL
SELECT 8 SEQ, 'A' GUBUN, 20 VALUE FROM DUAL UNION ALL
SELECT 6 SEQ, 'A' GUBUN, 30 VALUE FROM DUAL UNION ALL
SELECT 4 SEQ, 'B' GUBUN, 45 VALUE FROM DUAL UNION ALL
SELECT 3 SEQ, 'B' GUBUN, 70 VALUE FROM DUAL UNION ALL
SELECT 2 SEQ, 'B' GUBUN, 71 VALUE FROM DUAL
)
SELECT  GUBUN
       , MAX(VALUE) MAX_VALUE
       , MIN(VALUE) MIN_VALUE
       , MAX(VALUE)KEEP (DENSE_RANK LAST ORDER BY SEQ) LAST_VALUE1
       , MIN(VALUE)KEEP (DENSE_RANK LAST ORDER BY SEQ) LAST_VALUE2
       , SUM(VALUE)KEEP (DENSE_RANK LAST ORDER BY SEQ) LAST_VALUE3
       , AVG(VALUE)KEEP (DENSE_RANK LAST ORDER BY SEQ) LAST_VALUE4
       , MAX(VALUE)KEEP (DENSE_RANK FIRST ORDER BY SEQ) FIRST_VALUE1
       , MIN(VALUE)KEEP (DENSE_RANK FIRST ORDER BY SEQ) FIRST_VALUE2
       , SUM(VALUE)KEEP (DENSE_RANK FIRST ORDER BY SEQ) FIRST_VALUE3
       , AVG(VALUE)KEEP (DENSE_RANK FIRST ORDER BY SEQ) FIRST_VALUE4
    FROM TMP
GROUP BY GUBUN;

GUBUN    MAX_VALUE    MIN_VALUE    LAST_VALUE1    LAST_VALUE2    LAST_VALUE3    LAST_VALUE4    FIRST_VALUE1    FIRST_VALUE2    FIRST_VALUE3    FIRST_VALUE4

A    40    20    40    40    40    40    30    30    30    30
B    71    45    45    45    45    45    71    71    71    71


You may also like...

2 Responses

  1. 박진규 댓글:

    와, 직접 만든 사이트 인가요? 고퀄이네요!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다