컴공지식/데이터베이스

윈도우함수 범위 명령어를 알아보자

개강한 공대생 2024. 6. 20. 00:50

이런 테이블에 

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의 평균을 산출해야한다.