오라클 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
와, 직접 만든 사이트 인가요? 고퀄이네요!
설치형 워드프레스 + 스킨을 이용했습니다. ^^;