Database/MySQL

[MySQL] CUME_DIST(), PERCENT_RANK(), NTILE()

루루23 2024. 10. 23. 10:11
반응형

윈도우 함수 중 CUME_DIST(), NTILE(), PERCENT_RANK() 이 세가지에 대해 알아보겠습니다.

 

CUME_DIST() 

  • 누적상대도수
  • 동일한 값이 있을 경우, 그 값에 해당하는 행 전체를 누적 비율에 포함합니다.
  • ORDER BY로 정렬된 파티션에 대해 수행됩니다.
SELECT 
    title, rating, 
    CUME_DIST() OVER (ORDER BY rating DESC) AS cume_dist
FROM webtoons;

 

title rating cume_dist
No Home 10 0.25
Kubera 9 0.75
Dam in the Woods 9 0.75
Tower of God 5 1.00

 

 

PERCENT_RANK() 

  • 각 값의 순위 비율, PERCENT_RANK = (순위 - 1) / (전체 행의 수 - 1)
  • 첫 번째 값의 순위 비율은 항상 0이고, 동일한 값에 대해 같은 순위를 부여합니다.
  • ORDER BY로 정렬된 파티션에 대해 수행됩니다.
SELECT 
    title, rating, 
    PERCENT_RANK() OVER (ORDER BY rating DESC) AS percent_rank
FROM webtoons;

 

title rating percent_rank
No Home 10 0.0000
Kubera 9 0.3333
Wall in the Woods 9 0.3333
Tower of God 5 1.0000

 

 

CUME_DIST()와 PERCENT_RANK()

  CUME_DIST PERCENT_RANK
첫 번째 값의 비율 항상 1/N 항상 0
동일한 값의 처리 누적 비율에 모두 포함됨 동일한 순위로 처리됨
계산 기준 누적된 데이터의 비율 (순위 - 1) / (전체 개수 - 1)
범위 (0, 1] (0보다 크고, 최대 1) [0, 1] (0부터 시작, 최대 1)

 

쿼리 결과 예시

num row_num cume_dist percent_rank
1 1 0.1 0
2 2 0.2 0.1111111111111111
3 3 0.5 0.2222222222222222
3 4 0.5 0.2222222222222222
3 5 0.5 0.2222222222222222
4 6 0.7 0.5555555555555556
4 7 0.7 0.5555555555555556
5 8 0.8 0.7777777777777778
6 9 1 0.8888888888888888
6 10 1 0.8888888888888888

 

 NTILE() 

  • 데이터를 n개의 그룹으로 나누고, 각 행에 그룹 번호를 부여합니다.
  • 데이터는 최대한 동일한 개수로 각 그룹에 분배됩니다.
SELECT 
    title, rating, 
    NTILE(2) OVER (ORDER BY rating DESC) AS ntile_group
FROM webtoons;
title rating ntile_group
No Home 10 1
Kubera 9 1
Wall in the Woods 9 2
Tower of God 5 2

 

전체 결과 비교

title rating cume_dist percent_rank ntile_group
No Home 10 0.25 0 1
Kubera 9 0.75 0.3333 1
Dam in the Woods 9 0.75 0.3333 2
Tower of God 5 1.00 1 2

 

 

반응형