예를 들어 7일간 이동평균은 1~7일 평균, 2~8일 평균, 3~9일 평균 … 처럼 가장 오래된 데이터 대신에 최신의 데이터를 넣어 평균을 구하는 것을 말한다.
즉, 이동평균은 정해진 기간에서의 데이터의 평균이라고 할 수 있다.
2. 이동평균 구하는 구문
이동평균을 구하기 위해서, 윈도 함수인 OVER( ORDER BY ~) 구문을 활용해주어야 한다. 윈도함수를 통해 7일씩 데이터를 쪼개서 계산하는것이 원리이다.
이동평균을 구하는 구문은 다음과 같다.
SELECT<날짜칼럼>,AVG(SUM(구하고자하는칼럼))OVER(ORDERBY<날짜칼럼>ROWSBETWEEN6PRECEDINGANDCURRENTROW),-- 최근 최대 7일동안의 이동평균CASEWHEN7=count(*)OVER(ORDERBY<날짜칼럼>ROWSBETWEEN6PRECEDINGANDCURRENTROW)THENAVG(SUM(구하고자하는칼럼))OVER(ORDERBYdtROWSBETWEEN6PRECEDINGANDCURRENTROW)ENDAS-- 최근 7일 동안의 평균을 확실하게 계산하기FROM<테이블명>GROUPBY<날짜칼럼>;
위의 구문을 보면 이동평균 구하는 것을 2가지 방법으로 나누어 놓은 것을 볼 수 있다.
최근 최대 7일 동안의 이동평균
무조건 7일 동안의 평균
첫번째 방법은 7일의 기간이 충족되지 않는 1~6일도 있는 기간까지의 평균이 구해지는 방법이다.
반면 두번째 방법인 CASE 구문을 이용한 이동평균 구하기 방법은 무조건 기간이 7일이 되었을때 평균을 구하는 것이다.
3. 예제
다음 매출 데이터를 보자.
이 매출 데이터를 위에서 소개한 쿼리를 이용해 날짜별 매출과 7일 이동평균을 집계하는 결과물을 출력해보자
SELECTdt,SUM(purchase_amount)AStotal_amount,AVG(SUM(purchase_amount))OVER(ORDERBYdtROWSBETWEEN6PRECEDINGANDCURRENTROW)ASseven_day_avg,-- 최근 최대 7일 동안의 평균 계산하기.CASEWHEN7=count(*)OVER(ORDERBYdtROWSBETWEEN6PRECEDINGANDCURRENTROW)THENAVG(SUM(purchase_amount))OVER(ORDERBYdtROWSBETWEEN6PRECEDINGANDCURRENTROW)ENDASseven_day_avg_strict-- 최근 7일 동안의 평균을 확실하게 계산하기FROMpurchase_logGROUPBYdtORDERBYdt;
1) 점수 순서로 유일한 순위 2) 순위 상위부터의 누계 점수 계산 3) 현재 행과 앞 뒤의 행이 가진 값을 기반으로 평균 점수 계산하기 4) 순위가 높은 상품 ID 추출하기
SELECTproduct_id,score,row_number()over(ORDERBYscoreDESC)ASrow-- 점수 순서로 유일한 순위를 붙임,SUM(score)OVER(ORDERBYSCOREDESCROWSBETWEENUNBOUNDEDPRECEDINGANDCURRENTROW)AScum_score-- 순위 상위부터 누계 점수 계산하기,AVG(score)OVER(ORDERBYscoreDESCROWSBETWEEN1PRECEDINGAND1FOLLOWING)ASlocal_avg-- 현재 행과 앞 뒤의 행이 가진 값을 기반으로 평균 점수 계산하기,FIRST_VALUE(product_id)OVER(ORDERBYSCOREDESCROWSBETWEENUNBOUNDEDPRECEDINGANDUNBOUNDEDFOLLOWING)ASfirst_value-- 순위가 높은 상품 ID 추출하기,LAST_VALUE(product_id)OVER(ORDERBYSCOREDESCROWSBETWEENUNBOUNDEDPRECEDINGANDUNBOUNDEDFOLLOWING)ASlast_value-- 순위가 낮은 상품 ID 추출하기FROMpopular_products;