본문 바로가기
SQL

[SQL] 윈도우 함수 다시 정리

by 다람이도토리 2024. 1. 27.

*  한번 더 내용을 다시 정리합니다. 생각보다 자주 쓰이겠더라고요.

윈도우 함수란?

행간의 관계를 정의할 수 있는 함수들입니다. 
가능한 것들 : 랭킹 매기기, 누적합 계산하기 등등...

1) 누적합계 계산하기

SELECT EMPNO, ENAME, SAL
SUM(SAL) OVER(ORDER BY SAL
    ROWS BETWEEN UNBOUNDED PRECEDING
    AND CURRENT ROW)TOTSAL
FROM EMP;

OVER를 활용합니다. OVER은 기본적으로 범위를 결정합니다. SAL을 정렬한 뒤, 제한없이 맨 앞부터 해당 줄 까지 입니다. 즉 위의 구문은 급여가 가장 높은 사람부터 순차대로 급여의 누적합을 뱉어줍니다.

여기서 UNBOUNDED 대신 숫자를 넣는다면, 원하는 행 개수 만큼만 위로 올라가게 만들 수 있습니다. 

2) 순위 매기기

순위는 그냥 RANK와 DENSE_RANK 입니다. 이는 동순위 처리 조건에 대한 규칙입니다.
2등이 2명일때 다음이 4등이면 RANK,  다음이 3등이면 즉 2등 2명을 1명으로 취급할거면 DENSE_RANK 입니다.

SELECT
    RANK() OVER (ORDER BY SAL DESC) ALL_RANK,
    DENSE_RANK() OVER(ORDER BY SAL DESC) DENSE_RANK,
    RANK() OVER (PARTITION BY JOB ORDER BY SAL DESC) JOB_RANK,
FROM EMP;

위에서부터 살펴보면, 
- SAL이 높은 순서대로 등수를 매깁니다 동률일 경우 동률 각각을 모두 세서 다음 등수로 넘깁니다.
- SAL이 노픈 순서대로 등수를 매깁니다만, DENSE이므로 동률은 무조건 1명 취급입니다.
- JOB별로 등수를 매깁니다. 그룹별로 묶어서 따로 계산시켜 주는 것이 PARTITION 입니다.

3) 비율

Percent_rank : 상위 몇 % 인지 추출, 파티션 내의 비율을 따질때 사용할수도 있습니다. 파티션을 잡으면요.

SELECT 
    EMPLOYEE_ID, 
    DEPARTMENT_ID, 
    SALARY,
    ROUND(PERCENT_RANK() OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC),1) AS PERCENT_SAL
FROM EMPLOYEES
ORDER BY DEPARTMENT_ID ASC, PERCENT_SAL ASC;

NTILE : N-분위에 대해 출력, 정확하게는 N개의 그룹으로 나눠 어디에 속하는가를 따질 때 사용합니다.

SELECT 
    EMPLOYEE_ID, 
    DEPARTMENT_ID, 
    SALARY,
    NTILE(3) OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC) AS N_TILE
FROM EMPLOYEES
ORDER BY DEPARTMENT_ID ASC, N_TILE ASC;