개발/SQL

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

송디 2024. 5. 4. 19:51

출처 : 프로그래머스

■ 사용 문법 

RANK OVER

혹은 

NTILE

 

 

■ 사용 방법

우선 SIZE_OF_COLONY를 RANK함수로 순위를 나눠주고 이후 백분율을 구해주었다. 

그리고 기준에 따라 랭크를 입력하게 해주었다. 

내가 푼 방식은 굉장히 복잡하고 정신없었는데, 이것을 쉽게 해준 것이 NTILE 함수다. 

NTILE은 파티션을 설정할 수 있어 파티션 갯수에 따라 순위를 나누어준다.

 

■ 코드

SELECT C.ID, 
(CASE
    WHEN C.PERCENTAGE <= 25 THEN 'CRITICAL'
    WHEN C.PERCENTAGE <= 50 AND C.PERCENTAGE > 25 THEN 'HIGH'
    WHEN C.PERCENTAGE <= 75 AND C.PERCENTAGE > 50 THEN 'MEDIUM'
    ELSE 'LOW'
END) AS 'COLONY_NAME'
FROM (
    SELECT 
        A.ID, 
        B.COLONY_RANK, 
        (B.COLONY_RANK / (SELECT COUNT(*) FROM ECOLI_DATA)) * 100 AS PERCENTAGE
    FROM 
        ECOLI_DATA AS A
    JOIN (
        SELECT 
            ID, 
            RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) AS COLONY_RANK
        FROM 
            ECOLI_DATA
    ) AS B ON A.ID = B.ID
    GROUP BY 
        A.ID, 
        B.COLONY_RANK) AS C
ORDER BY C.ID

 

* NTILE 사용시 

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