① 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 함수
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.