윈도우 함수는 행과 행간의 비교 및 연산을 할 수 있는 함수이며, 보통은 정렬목적으로 사용한다.
ROW_NUMBER, RANK, DENSE_RANK 등 보통 행의 순위와 해당 순위를 통해 출력할 행의 갯수를 제한할때 많이 활용한다.
이 윈도우 함수를 사용할때 유의해야할 특징이 몇가지 있다.
SELECT WINDOW_FUNCTION(COLUMN) OVER (PARTITON BY A, ORDER BY B)
WINDOW_FUNCTION의 인자에 특정 COLUMN이 들어간다면, 보통 행과 행간의 연산(합계, 평균 등)을 위한 함수이다.
WINDOW_FUNCTION은 그 자체로 정렬 결과를 도출할 수 있고, 내부적으로 특정 기준에 따라 정렬한 후 윈도우 함수의 연산 결과만을 도출할 수도 있다.
※ 정렬결과 자체를 도출하는 경우
SELECT COLUMN_A, COLUMN_B
FROM(
SELECT COLUMN_A, COLUMN_B, COLUMN_C
,ROW_NUMBER() OVER(PARTITION BY COLUMN_A, ORDER BY COLUMN_B)
FROM TABLE
)
WHERE RNK < 50;
위 쿼리는 ROW_NUMBER() 윈도우 함수로 인해, COLUMN_A를 그룹기준으로 하여 COLUMN_B를 오름차순으로 정렬한 결과에 대해 순위를 부여한 결과를 출력한다.
윈도우 함수로 인해 자체적으로 정렬이 된 상태를 그대로 출력한다.
※ 연산 결과만을 도출하는 경우
SELECT COLUMN_A, AVG(COLUMN_B)
,COUNT(*) OVER(ORDER BY AVG(COLUMN_B) BETWEEN 100 PRECEDING AND 100 FOLLOWING)
FROM TABLE
GROUP BY COLUMN_A
위 쿼리는 COUNT(*) OVER 윈도우 함수를 사용하고, OVER에서 정한 기준에 따라 정렬한 결과에 대해 윈도우 함수의 연산 결과만을 도출한다.
※ 연산 순서
윈도우 함수의 개념(OVER의 의미) - https://geniusjo.tistory.com/entry/%EC%9C%88%EB%8F%84%EC%9A%B0-%ED%95%A8%EC%88%98WINDOW-FUNCTION
윈도우 함수의 개념 - https://for-my-wealthy-life.tistory.com/48
LAG/LEAD - https://aljjabaegi.tistory.com/576