더북(TheBook)

① 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);
그림 7-27 FIRST_VALUE 함수

부서별 입사일자 순으로 정렬되어 있으므로, 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);
그림 7-28 LAST_VALUE 함수
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.