코테/프로그래머스

[프로그래머스] 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;