[MySQL] Window 함수 기반 그룹 & 범위 계산 함수 정리

Hyunjun Kim·2025년 10월 26일
0

SQL

목록 보기
88/90

MySQL 8.0 이상에서 지원하는, 대표적인 함수들을 정리해보았다.

1. NTILE

정의: 그룹 내 데이터를 정렬 후 지정한 bucket 수로 나누고, 각 행에 bucket 번호를 부여한다.

사용 예시:

SELECT 
    id,
    size_of_colony,
    NTILE(4) OVER (ORDER BY size_of_colony) AS tile
FROM ECOLI_DATA
ORDER BY id;

결과 예시

idsize_of_colonytile
1101
2232
3413
4584
  • 1~4 숫자로 각 행이 속한 그룹을 나타낸다.
  • 주로 분위수(quartile) 계산에 사용된다.
  • NTILE은 마지막 단계에 그룹 이름 매핑할 때 적용한다.

2. CUME_DIST

정의: 그룹 내에서 현재 행의 누적 분포 비율을 계산한다.

사용 예시:

SELECT 
    id,
    size_of_colony,
    CUME_DIST() OVER (ORDER BY size_of_colony) AS cumulative_ratio
FROM ECOLI_DATA;

결과 예시

idsize_of_colonycumulative_ratio
1100.25
2230.50
3410.75
4581.0
  • 누적 비율을 계산하여 상위 몇 %에 속하는지 판단할 때 사용한다.
  • NTILE과 함께 분위수 기준 그룹을 나눌 때 참고 자료로 활용 가능하다.

3. DENSE_RANK

정의: 값이 동일한 경우 같은 순위를 부여하며, 순위를 건너뛰지 않는다.

사용 예시:

SELECT 
    id,
    size_of_colony,
    DENSE_RANK() OVER (ORDER BY size_of_colony DESC) AS dense_rank
FROM ECOLI_DATA;
idsize_of_colonydense_rank
4581
3412
2412
1103
  • 순위가 연속적으로 부여되므로, 동일값 처리 후 그룹 배치에 유용하다.

4. RANK

정의: 값이 동일하면 같은 순위를 부여하며, 다음 순위는 건너뛴다.

사용 예시:

SELECT 
    id,
    size_of_colony,
    RANK() OVER (ORDER BY size_of_colony DESC) AS rank
FROM ECOLI_DATA;

결과 예시

idsize_of_colonyrank
4581
3412
2412
1104
  • 동일값이 있을 경우 순위가 건너뛴다.
  • 그룹화 시, 동일 순위 처리 방식이 NTILE 결과에 영향을 줄 수 있다.

5. ROW_NUMBER

정의: 중복 여부와 상관없이 각 행에 고유 순번을 부여한다.

사용 예시:

SELECT 
    id,
    size_of_colony,
    ROW_NUMBER() OVER (ORDER BY size_of_colony DESC) AS row_num
FROM ECOLI_DATA;

결과 예시

idsize_of_colonyrow_num
4301
2202
3203
1104
  • 고유 식별 순번을 만들 때 사용한다.
  • 그룹 배치 후 순서 기준으로 활용 가능하다.

6. LAG / LEAD

정의: 이전 또는 다음 행 값에 접근할 수 있다.

사용 예시:

SELECT 
    id,
    size_of_colony,
    LAG(size_of_colony, 1) OVER (ORDER BY id) AS prev_colony,
    LEAD(size_of_colony, 1) OVER (ORDER BY id) AS next_colony
FROM ECOLI_DATA;

결과 예시

idsize_of_colonyprev_colonynext_colony
110NULL23
2231041
3412358
45841NULL
  • 전후 값 비교나 증감율 계산에 사용된다.
  • NTILE, 분위수 계산 후 연속 범위 체크에 활용 가능하다

7. PERCENT_RANK

정의: 그룹 내에서 행의 순위를 백분위 순위로 반환한다.

사용 예시:

SELECT 
    id,
    size_of_colony,
    PERCENT_RANK() OVER (ORDER BY size_of_colony) AS percent_rank
FROM ECOLI_DATA;

결과 예시:

idsize_of_colonypercent_rank
1100.0
2230.3333
3410.6667
4581.0
  • 상위 몇 %에 속하는지 판단할 때 유용하다.
  • NTILE과 함께 그룹 기준 참고자료로 활용 가능하다.

8. RATIO_TO_REPORT

정의: 그룹 내에서 값이 전체 합에서 차지하는 비율을 계산한다.

사용 예시:

SELECT 
    id,
    size_of_colony,
    size_of_colony / SUM(size_of_colony) OVER () AS ratio
FROM ECOLI_DATA;

결과 예시

idsize_of_colonyratio
1100.0714
2230.1643
3410.2929
4580.4143
  • 점유율, 구성비 계산에 사용된다.
  • 그룹 배치 후 시각화에 활용 가능하다.

9. WIDTH_BUCKET

정의: 값을 균등한 간격의 버킷(구간)에 할당한다.

사용 예시:

SELECT 
    id,
    size_of_colony,
    WIDTH_BUCKET(size_of_colony, 0, 100, 4) AS bucket
FROM ECOLI_DATA;

결과 예시

idsize_of_colonybucket
1101
2231
3412
4583
  • 히스토그램, 구간 분석에 사용된다.
  • NTILE과 달리 구간 너비를 직접 지정 가능하다.
profile
Data Analytics Engineer 가 되

0개의 댓글