본문 바로가기

코딩테스트 연습/programmers

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

문제

대장균 개체의 크기를 내름차순으로 정렬했을 때 상위 0% ~ 25% 를 'CRITICAL', 26% ~ 50% 를 'HIGH', 51% ~ 75% 를 'MEDIUM', 76% ~ 100% 를 'LOW' 라고 분류합니다. 대장균 개체의 ID(ID) 와 분류된 이름(COLONY_NAME)을 출력하는 SQL 문을 작성해주세요. 이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요 . 단, 총 데이터의 수는 4의 배수이며 같은 사이즈의 대장균 개체가 서로 다른 이름으로 분류되는 경우는 없습니다.

 

 

순간적으로 RANK 가 떠올라서 어떻게쓰는지 구글 검색 후 적용했다.

SIZE_OF_COLONY 내림차순한 기준으로 순서를 매기고, 등급 구분함.

RANK를 사용하는 경우 COUNT(*) 가 아니라 COUNT(*) OVER 를 써야 전체 행 개수를 셀 수 있다.

SELECT ID, 
CASE 
WHEN rank() over (order by SIZE_OF_COLONY desc) <= COUNT(*) OVER ()/4*1 THEN 'CRITICAL'
WHEN rank() over (order by SIZE_OF_COLONY desc) <= COUNT(*) OVER ()/4*2 THEN 'HIGH'
WHEN rank() over (order by SIZE_OF_COLONY desc) <= COUNT(*) OVER ()/4*3 THEN 'MEDIUM'
WHEN rank() over (order by SIZE_OF_COLONY desc) <= COUNT(*) OVER ()/4*4 THEN 'LOW'
END AS COLONY_NAME
FROM ECOLI_DATA
ORDER BY ID

 

 

 

 

GPT한테 물어보니 아래 방법이 더 효율적이라고 한다~!

SELECT 
    ID,
    CASE 
        WHEN r <= total / 4 * 1 THEN 'CRITICAL'
        WHEN r <= total / 4 * 2 THEN 'HIGH'
        WHEN r <= total / 4 * 3 THEN 'MEDIUM'
        ELSE 'LOW'
    END AS COLONY_NAME
FROM (
    SELECT 
        ID,
        RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) AS r,
        COUNT(*) OVER () AS total
    FROM ECOLI_DATA
    ORDER BY ID
) AS ranked;