코테/프로그래머스
[프로그래머스] 301649 대장균의 크기에 따라 분류하기 2 (MySQL)
zsunny
2024. 11. 6. 14:38
https://school.programmers.co.kr/learn/courses/30/lessons/301649
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제를 읽고 처음 들었던 생각은 가장 긴 길이를 기준으로 4등분하면 되겠다고 생각하고 짰다.
하지만,, 출력결과를 보고 깨달았다. 길이는 기준이 되지 못하겠구나..!! => 2 2 2 2 12 12 12 12 가 있다면, 2들은 무조건 LOW로 출력된다,,
그래서 아래의 결과가 나왔다.
SELECT ID, (CASE
WHEN SIZE_OF_COLONY >= MAX_SIZE*0.75 THEN 'CRITICAL'
WHEN SIZE_OF_COLONY >= MAX_SIZE*0.5 THEN 'HIGH'
WHEN SIZE_OF_COLONY >= MAX_SIZE*0.25 THEN 'MEDIUM'
ELSE 'LOW' END) AS COLONY_NAME
FROM ECOLI_DATA, (SELECT MAX(SIZE_OF_COLONY) AS MAX_SIZE FROM ECOLI_DATA) AS MAX_SIZE_TABLE
ORDER BY 1;
그러면 전체 개수를 무조건 4등분하기 위해서 무슨 기준으로 나누어야 하지,,?
정답은 랭크를 먹여주는 순위함수에 있었다!!!!!
*** NTILE (순위함수)
: 지정된 수만큼 등급으로 나누어 각 등급번호 출력
SELECT ID, NTILE (나눌등급수) OVER (ORDER BY 등급나눌컬럼 DESC) AS '출력컬럼명'
FROM 테이블명;
이와 같은 형태로 구현하게 된다.
<제출코드>
-- 코드를 작성해주세요
-- 대장균 개체의 ID(ID) 와 분류된 이름(COLONY_NAME)을 출력
-- 개체의 ID 에 대해 오름차순
WITH COLONY_RANK AS (SELECT ID, NTILE(4) OVER (ORDER BY SIZE_OF_COLONY DESC) AS SIZE_RANK
FROM ECOLI_DATA)
SELECT ID, CASE WHEN SIZE_RANK = 1 THEN 'CRITICAL'
WHEN SIZE_RANK = 2 THEN 'HIGH'
WHEN SIZE_RANK = 3 THEN 'MEDIUM'
ELSE 'LOW' END AS COLONY_NAME
FROM COLONY_RANK
ORDER BY 1;