오라클의 쿼리 결과에서 첫번째 행의 값을 가져올때는 FIRST_VALUE 함수를 사용하고, 마지막 행의 값을 가져올때는 LAST_VALUE 함수를 사용하면 된다.
FIRST_VALUE, LAST_VALUE는 오라클에서만 지원하는 함수이기 때문에 타 DB에서는 사용할 수 없다.
기본적인 사용법
SELECT ename
, job
, sal
, FIRST_VALUE(sal) OVER() AS sal_first
, LAST_VALUE(sal) OVER() AS sal_last
FROM emp
WHERE job in ('MANAGER', 'ANALYST')
쿼리 결과의 첫번째 행의 급여(sal) 값과 마지막 행의 급여(sal)의 값을 표시한다.
ORDER BY, PARTITION BY 사용
SELECT ename
, hiredate
, job
, sal
, FIRST_VALUE(sal) OVER(ORDER BY hiredate) AS sal_first
FROM emp
WHERE job in ('MANAGER', 'ANALYST')
OVER(ORDER BY 컬럼명)을 사용할 경우 메인 쿼리 순서와 상관없이 지정한 컬럼으로 정렬하여 첫번째 행의 값을 표시한다.
SELECT ename
, hiredate
, job
, sal
, FIRST_VALUE(sal) OVER(PARTITION BY job ORDER BY hiredate) AS sal_first
FROM emp
WHERE job in ('MANAGER', 'ANALYST')
OVER(PARTITION BY 컬럼명)을 사용할 경우 해당 컬럼의 그룹별로 첫번째 행의 값을 표시 한다.
SELECT ename
, hiredate
, job
, sal
, LAST_VALUE(sal) OVER(ORDER BY hiredate
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS sal_first
FROM emp
WHERE job in ('MANAGER', 'ANALYST')
LAST_VALUE 함수에서 ORDER BY를 사용할 경우 WINDOWING 절에 해당 조건을 추가해야 한다 "ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING"
UNBOUNDED PRECEDING : PARTITION의 첫 번째 로우에서 윈도우가 시작한다 |
SELECT ename
, hiredate
, job
, sal
, LAST_VALUE(sal) OVER(PARTITION BY job ORDER BY hiredate
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS sal_first
FROM emp
WHERE job in ('MANAGER', 'ANALYST')
NULL 값을 표시 안 할 경우
SELECT ename
, job
, comm
, FIRST_VALUE(comm IGNORE NULLS) OVER() AS comm_first
FROM emp
WHERE job in ('MANAGER', 'SALESMAN')
FIRST_VALUE(컬럼명 [RESPECT|IGNORE NULLS]) OVER()
NULL 값을 제외한 가장 첫번째 행의 값을 표시한다.
사용 예제