-
윈도우함수 범위 명령어를 알아보자컴공지식/데이터베이스 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의 평균을 산출해야한다.
'컴공지식 > 데이터베이스' 카테고리의 다른 글
SQL 형태들 (0) 2024.11.05 Stored Procedure와 Function의 차이 (0) 2024.06.19 B+트리에서 insertion 꿀팁 (0) 2024.06.17 SQL 뷰가 업데이트 가능하려면? (0) 2024.06.16 뷰와 네임드 서브 쿼리 (0) 2024.06.16