Algorithm/Programmers SQL

[MySQL] 프로그래머스 대장균의 크기에 따라 분류하기 2

제우제우 2024. 9. 12. 11:59

https://school.programmers.co.kr/learn/courses/30/lessons/301649

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코딩테스트 연습 > SELECT > 대장균의 크기에 따라 분류하기 2

문제 분석

난이도: LEVEL3

 

문제 요구사항

대장균 개체의 크기를 내림차순으로 정렬했을 때 상위 0% ~ 25% 를 'CRITICAL', 26% ~ 50% 를 'HIGH', 51% ~ 75% 를 'MEDIUM', 76% ~ 100% 를 'LOW' 라고 분류합니다.

대장균 개체의 ID(ID) 와 분류된 이름(COLONY_NAME)을 출력하는 SQL 문을 작성해주세요.

이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요 .

단, 총 데이터의 수는 4의 배수이며 같은 사이즈의 대장균 개체가 서로 다른 이름으로 분류되는 경우는 없습니다.

 

정답 코드1

SELECT ID, 
       CASE 
           WHEN NTILE(4) OVER (ORDER BY SIZE_OF_COLONY DESC) = 1 THEN 'CRITICAL'
           WHEN NTILE(4) OVER (ORDER BY SIZE_OF_COLONY DESC) = 2 THEN 'HIGH'
           WHEN NTILE(4) OVER (ORDER BY SIZE_OF_COLONY DESC) = 3 THEN 'MEDIUM'
           ELSE 'LOW'
       END AS COLONY_NAME
FROM ECOLI_DATA
ORDER BY ID;

윈도우 순위 함수 NTILE(N)을 사용하여 SIZE_OF_COLONY에 따라서 4개의 순위로 나누고 

CASE WHEN을 활용하여 순위에 따라서 COLONY_NAME이 나오게 하였다.  

문제점: CASE WHEN에서 윈도우 함수 NTILE이 반복적 호출 

 

정답 코드2 (정답 코드1 개선: CTE)

WITH ECOLI_CTE AS (
    SELECT ID, NTILE(4) OVER (ORDER BY SIZE_OF_COLONY DESC) AS COLONY_RANK
    FROM ECOLI_DATA
)
SELECT ID, 
(CASE
   WHEN COLONY_RANK = 1 THEN 'CRITICAL'
   WHEN COLONY_RANK = 2 THEN 'HIGH'
   WHEN COLONY_RANK = 3 THEN 'MEDIUM'
   ELSE 'LOW'
END ) COLONY_NAME
FROM ECOLI_CTE 
ORDER BY ID

 

정답 코드1에서 CTE를 사용하여 반복적인 윈도우 함수 호출을 줄였다. 

 

정답 코드3(정답 코드1 개선: 서브 쿼리)

SELECT ID, 
CASE 
    WHEN COLONY_RANK = 1 THEN 'CRITICAL'
    WHEN COLONY_RANK = 2 THEN 'HIGH'
    WHEN COLONY_RANK = 3 THEN 'MEDIUM'
    ELSE 'LOW'
END COLONY_NAME
FROM (SELECT ID, NTILE(4) OVER (ORDER BY SIZE_OF_COLONY DESC) COLONY_RANK 
      FROM ECOLI_DATA
     ) SUB_QUERY     
ORDER BY ID

 

정답 코드1에서 서브 쿼리를 통해서 반복적인 윈도우 함수 호출을 줄였다. 

참고 

CTE 

https://20240228.tistory.com/232

 

[MySQL] Common Table Expression (CTE)

Common Table ExpressionMySQL 8.XX 버전부터 사용이 가능한 Common Table Expression 즉 CTE는 복잡한 쿼리를 더 간단하고 읽기 쉽게 작성하는 방법으로, 하나의 쿼리에서 재사용할 수 있는 임시 결과 집합을 정

20240228.tistory.com

 

순위 함수 

https://20240228.tistory.com/237

 

[MySQL] 순위 함수 정리

순위 함수? 순위 함수들은 데이터에 순위를 부여하거나 그룹 내에서 특정 값을 계산하는데 사용된다. 이 함수들은 주로 분석 및 통계 작업에서 유용하다. MySQL 8.0부터 순위 함수들을 사용할 수

20240228.tistory.com