더북(TheBook)

이번에는 두 함수의 두 번째 매개변수로 2를 입력합니다. 따라서 현재 로우를 기준으로 두 번째 앞 로우와 두 번째 뒤 로우를 찾습니다. LAG() 함수의 반환값을 보면 104번은 0을 반환했는데, 이는 두 번째 앞에 해당하는 로우가 없기 때문입니다. 105번은 두 번째 앞 로우가 103번이므로 9000을 반환했습니다. LEAD() 함수도 마찬가지로 두 번째 뒤 로우를 참조하므로 105번은 107번의 급여인 4200을 반환했고, 106번은 두 번째 뒤 로우가 없으므로 0을 반환했습니다.

LAG()LEAD()는 매우 유용한 함수입니다. SQL 문은 일반적으로 로우 단위로 처리되는데, 특정 그룹별로 앞뒤 로우의 값을 가져올 수 있으니 매우 획기적인 기능입니다. 가령 전년 대비 매출 증감률을 구한다고 해 보죠. 매출 증감률은 (올해 매출 – 전년 매출) / 전년 매출 × 100으로 계산할 수 있습니다. 이를 SQL 문으로 구하려면 올해와 전년 매출이 필요한데, 보통은 연도와 매출이 한 로우에 담겨 있습니다. 2018년 매출은 1000, 2019년 매출은 2000, 이런 식이죠. 2019년을 기준으로 2018년 매출인 1000이란 값을 가져오려면 아주 복잡한 SELECT 문을 작성해야 하지만, LAG()LEAD() 함수 덕분에 쉽게 계산할 수 있습니다.

코드 11-18

WITH basis AS
(SELECT YEAR(release_date) years, sale_amt,
        LAG(sale_amt, 1, 0) OVER (ORDER BY YEAR(release_date)) lastyear_sale_amt
   FROM box_office
  WHERE ranks = 1
)
SELECT years, sale_amt, lastyear_sale_amt,
       ROUND((sale_amt - lastyear_sale_amt) / lastyear_sale_amt * 100, 2) rates
  FROM basis
 ORDER BY 1 DESC ;

실행결과

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.