① FIRST_VALUE(expr)와 LAST_VALUE(expr)
함수 명칭만 봐도 유추할 수 있듯이 주어진 그룹 상에서 FIRST_VALUE는 가장 첫 번째 값을, LAST_VALUE는 가장 마지막 값을 반환한다.
입력
SELECT department_id, emp_name, hire_date, salary,
FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY hire_Date
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS all_salary,
FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY hire_Date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS fr_st_to_current_sal,
FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY hire_Date
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) AS fr_current_to_end_sal
FROM employees
WHERE department_id IN (30, 90);
부서별 입사일자 순으로 정렬되어 있으므로, 30번 부서의 첫 번째 값은 11,000, 90번 부서의 17,000이 all_salary 컬럼 값에 나와 있다. 30번 부서는 fr_st_current_sal은 그룹의 시작 지점인 Den부터 현재 로우까지 대상으로 첫 번째 값을 추출하므로 모두 11,000이지만, fr_current_to_end_sal 컬럼 값은 현재 로우부터 끝 지점인 Karen까지가 대상으로 첫 번째 값을 추출하므로 자신의 급여가 계산되어 출력되었음을 알 수 있다.
LAST_VALUE 함수는 마지막 값을 보여준다는 점만 제외하면 FIRST_VALUE 함수와 동작 방식은 같다.
입력
SELECT department_id, emp_name, hire_date, salary,
LAST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY hire_Date
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS all_salary,
LAST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY hire_Date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS fr_st_to_current_sal,
LAST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY hire_Date
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) AS fr_current_to_end_sal
FROM employees
WHERE department_id IN (30, 90);