DB & SQL/데이터 분석 SQL

데이터 분석 SQL - Analytic SQL 개요와 순위

PHM 2022. 10. 6. 17:43

Analytic SQL - Group by 집계 함수 차이

- Group by는 원본 데이터 집합의 레벨을 변경해서 적용 - Analytic SQL은 원본 데이터 집합의 레벨을 그대로 유지하면서 적용
- Window를 이용하여 Row 단위의 집합 연산 수행 가능

 

Analytic SQL 유형 및 사용법

유형 함수
순위/비율 함수 Rank, dense_rank, row_number, Percent_rank,
cume_dist, ntile
집계(Aggregate) 함수 sum, max, min, avg, count ( distinct x )
Lead/Lag Lead, Lag
First_value/Last_value First_value, Last_value
Inverse Percentile Percentile_cont, Percentile_disc
<Analytic function>(인자1, ...)
OVER (
    [Partition 절]	-- 그룹화 컬럼명
    [Sorting 절]	-- 정렬 컬럼명(Window 이동 방향 기준 컬럼명)
    [window 절]		-- Window 범위(Row, Range)
)

- 절의 순서가 바뀌어서는 안됨!

- 원본 데이터의 레벨을 그대로 유지하면서, 그룹핑 레벨에서 자유롭게 Window의 이동과 크기를 조절하면서 Analytic을 수행

- 자유로운 window 설정에 따른 analytic 구사가 가능하므로 SQL의 Analytic 함수를 window 함수로도 지칭

 


순위 Analytic SQL

- 일반적인 순위 : rank, dense_rank. row_number

- 0~1 사이 정규화 순위 : cume_dist, percent_rank

- 분위 : ntile

 

순위 Analytic - rank, dense_rank, row_numbe

- 전체 데이터/특정 그룹핑 내에서 특정 기순으로 순위를 매기는 함수

- Rank, dense_rank, row_number 는 공동 순위를 정하는 로직이 조금씩 다름

순위 함수 유형 설명
rank 공동 순위가 있을 경우 다음 순위는 공동 순위 개수만큼 밀려서 정함
1,2,2,4 또는 1,2,2,2,5
dense_rank 공동 순위가 있더라도 다음 순위는 바로 이어서 정함
1,2,2,3 또는 1,2,2,2,3
row_number 공동 순위가 있더라도 반드시 unique한 순위를 정함
1,2,3,4,5
select a.empno, ename, job, sal
    , rank() over(order by sal desc) as rank
    , dense_rank() over(order by sal desc) as dense_rank
    , row_number() over(order by sal desc) as row_number from hr.emp a;

 

select a.empno, ename, job, deptno, sal
    , rank() over(partition by deptno order by sal desc) as rank
    , dense_rank() over(partition by deptno order by sal desc) as dense_rank
    , row_number() over(partition by deptno order by sal desc) as row_number
from hr.emp a;

 

순위 함수에서 NULL 처리 로직

rank() OVER (
    < Partition 절 >
    order by column [nulls first/last]
- Nulls first는 Null을 최우선 순위로,
- Nulls last는 Null을 가장 마지막 순위로 결정

- Order by 시 기본적으로 생략되어 있으며 Default는 nulls first임.

- Nulls first 는 Null을 최우선으로, Nulls last는 Null을 가장 마지막으로