DA Study/TIL

[TIL] PERCENT_RANK() OVER() 윈도우 함수 활용 # MYSQL

harrym8n 2024. 12. 28. 21:43

Programmers Lv.3 - 대장균의 크기에 따라 분류하기 2
👉 문제 바로가기(프로그래머스)

# 대장균 개체의 크기를 내름차순으로 정렬했을 때
# 상위 0% ~ 25% 를 'CRITICAL', 26% ~ 50% 를 'HIGH', 51% ~ 75% 를 'MEDIUM', 76% ~ 100% 를 'LOW' 라고 분류하여 조회
# ID 오름차순 정렬하여 조회

SELECT 
    ID, 
    CASE WHEN PERCENT_RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) <= 0.25 THEN 'CRITICAL'
         WHEN PERCENT_RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) > 0.25 AND
              PERCENT_RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) <= 0.5 THEN 'HIGH'
         WHEN PERCENT_RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) > 0.5 AND
              PERCENT_RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) <= 0.75 THEN 'MEDIUM'
         WHEN PERCENT_RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) > 0.75 THEN 'LOW'
    END as COLONY_NAME
FROM ECOLI_DATA
ORDER BY ID

[ 논리 과정 ]

  1. SIZE_OF_COLONY로 내림차순하여 순위를 구한다.
  2. 퍼센트 구간에 따라 COLONY_NAME을 할당하여 조회한다.

[ 문제 상황 ]

  • SIZE_OF_COLONY 순위를 구하더라도 해당 데이터가 전체 데이터에서 차지하는 비율(%)을 산출할 수가 없다.

[ 해결 ]

  • PERCENT_RANK() OVER()를 사용하여 각 데이터 행별로 전체 데이터에서 몇 퍼센트를 차지하는지 산출한다.
  • 그 다음 CASE WHEN ~ THEN 구문을 활용하여 COLONY_NAME을 할당한다.

[ 회고 ]

  • RANK 함수와 더불어 윈도우 함수 학습이 필요하다.
  • PERCENT_RANK() OVER() 구문을 CASE WHEN ~ THEN 구문과 함께 사용하여 반복 작성 되었는데, PERCETN_RANK를 구한 테이블을 FROM절에서 서브쿼리로 JOIN하여 SELECT절의 복잡도를 해소시킬 수도 있을 것 같다.