윈도우함수 범위 명령어를 알아보자
이런 테이블에
SELECT ID, CITY, ORD_AMT, ORD_DATE,
AVG(ORD_AMT) OVER(PARTITION BY CITY ORDER BY ORD_DATE
ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING) AS AVG_AMT
FROM ORDERS;
다음과 같은 쿼리를 실행하면 다음과 같은 결과가 나온다
나는 여기서 도대체 0 FOLLOWING(현재 행)이 도대체 뭔지 헷갈렸었다..
근데 알고보면 쉬운거다.
그냥 순서대로 현재행이 되는거다.
만약 쿼리가 실행되면 1번 아이디를 가진 행이 현재 행이 될 것이고
해당 행에 대한 쿼리 탐색이 끝나면 그 다음 행인 2번 아이디를 가진 행이 현재 행이 되는 것이다.
그런식으로 쿼리를 해석하면 위의 쿼리를 이해할 수 있다.
아이디가 1인 서울은 PRECEDING 행이 없으니 AVG를 산출할 때 자기 자신만을 이용해 결국 AVG는 100이 나온다.
아이디가 2인 서울은 아이디가 1번인 서울 행이 PRECEDING 행이므로 이 둘의 ORD_AMT 평균이 아이디가 2인 서울의 AVG_AMT가 된다.
이제 다른 쿼리를 알아보자
이런 테이블에
SELECT ID, ORD_DATE, ORD_AMT,
AVG(ORD_AMT) OVER(ORDER BY ORD_DATE
RANGE BETWEEN INTERVAL 2 DAY PRECEDING AND CURRENT ROW) AS AVG_AMT
FROM ORDERS;
다음과 같은 쿼리를 실행하면 다음과 같은 결과가 나온다
위 쿼리는 2일 전까지의 행부터 현재 행까지의 ORD_AMT의 평균을 산출하는 쿼리이다.
다만, 아이디 4번과 5번과 같은 경우는 주의해야한다.
2023-01-04가 없기 때문에 아이디 4번의 AVG_AMT를 산출하려면 그저 3일 것과 5일 만의 ORD_AMT의 평균을 산출해야한다.
5번도 마찬가지로 4일이 없기 때문에 6일과 5일의 ORD_AMT의 평균을 산출해야한다.