https://school.programmers.co.kr/learn/courses/30/lessons/301649
코딩테스트 연습 > 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
순위 함수
https://20240228.tistory.com/237
'Algorithm > Programmers SQL' 카테고리의 다른 글
[MySQL] 프로그래머스 대장균들의 자식의 수 구하기 (0) | 2024.09.15 |
---|---|
[MySQL] 프로그래머스 대장균의 크기에 따라 분류하기 1 (0) | 2024.09.15 |
[MySQL] 프로그래머스 최솟값 구하기 (1) | 2024.09.11 |
[MySQL] 프로그래머스 고양이와 개는 몇 마리 있을까 (0) | 2024.09.11 |
[MySQL] 프로그래머스 동명 동물 수 찾기 (0) | 2024.09.11 |