1. Window Function
Analytic Function으로도 불러며 행과 행간의 관계를 쉽게 정의할 수 있는 함수들입니다. group by와 비슷하게 데이터를 집계해 주지만 큰 차이점은 데이터 집합의 레벨을 유지한다는 데에 있습니다. 그중 Rank관련 함수에 대해 알아보겠습니다.
2. 사용법
다음과 같이 직원 관련 테이블에서 급여 순위(salary)를 조회할 때,
2-1. dense_rank : 공동 순위가 있을 경우 다음 순위는 밀리지 않고 이어짐
SELECT name,
salary,
dense_rank() over (order by salary desc) as salary_rank
FROM EMP;
2-2. row_number : 공동 순위가 있더라도 고유한 순위가 매겨짐
SELECT name,
salary,
row_number() over (order by salary desc) as salary_rank
FROM EMP;
2-3. rank : 공동 순위가 있을 경우 다음 순위는 공동 순위만큼 밀림
SELECT name,
salary,
rank() over (order by salary desc) as salary_rank
FROM EMP;
3. 응용
3-1. 부서별 급여 1등
SELECT *
FROM
(SELECT name,
department,
salary,
rank() over (partition by department order by salary desc) as salary_rank
FROM EMP) A
WHERE salary_rank = 1;
3-2. 부서별 급여 1등, 꼴등
SELECT *
FROM
(SELECT name,
department,
salary,
rank() over (partition by department order by salary desc) as salary_rank1,
rank() over (partition by department order by salary ) as salary_rank2
FROM EMP) A
WHERE salary_rank1 = 1
OR salary_rank2 = 1;
3-3. 보너스 순위
SELECT name,
department,
bonus,
rank() over (order by bonus desc) as bonus_rank
FROM EMP;
※ 주의 : mysql에서는 위와 같이 null값이 자동으로 후순위로 가지만 oracle에서는 nulls last를 해줘야 null값들이 후순위가 됩니다.
https://www.kaggle.com/code/alexisbcook/analytic-functions
Analytic Functions
Explore and run machine learning code with Kaggle Notebooks | Using data from San Francisco Open Data
www.kaggle.com
'SQL' 카테고리의 다른 글
[Oracle] 튜닝을 위한 간단한 힌트 정리 (0) | 2022.03.27 |
---|