프로그래머스 Lv3 대장균의 크기에 따라 분류하기 2(MySQL)

vvo_ter·2024년 7월 13일
0

daily-sql

목록 보기
1/6
post-custom-banner

하루에 sql 꼭 하나씩 풀기를.. D+1

💻 문제

코딩테스트 연습 > SELECT > 대장균 크기에 따라 분류하기 2

  • rank() 활용

문제 설명

대장균 개체의 크기(SIZEOF_COLONY)를 내림차순으로 정렬했을 때 상위 0% ~ 25% 를 'CRITICAL', 26% ~ 50% 를 'HIGH', 51% ~ 75% 를 'MEDIUM', 76% ~ 100% 를 'LOW' 라고 분류_합니다. 대장균 개체의 ID(ID) 와 분류된 이름(COLONY_NAME)을 출력하는 SQL 문을 작성해주세요. 이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요 .

테이블 설명

ID와 SIZE_OF_COLONY만을 활용합니다.


🔐 풀이

아이디어

RANK 함수를 활용하여 등수를 할당하고 등수를 전체 개수로 나눈 것에 100을 곱하여 퍼센트를 구합니다.
구한 퍼센트 정보에 따라 CASE WHEN으로 COLONY_NAME 값을 할당합니다.


👉 제출 코드

with t1 as (
    select id, size_of_colony, rank() over(order by size_of_colony desc) as ranking
    from ecoli_data
), t2 as (
    select id, size_of_colony, ranking, (ranking / (select count(*) from ecoli_data)) * 100 as per
    from t1
), t3 as (
    select id, size_of_colony, ranking, case 
        when per <= 25 then 'CRITICAL'
        when per > 25 and per < 50 then 'HIGH'
        when per > 50 and per <= 75 then 'MEDIUM'
        else 'LOW'
    end as colony_name
    from t2
)

select id, colony_name
from t3
order by id

🥑 순위함수

다른 순위함수를 알아보겠습니다.

NTILE()

지정된 수 만큼의 등급으로 나누어 각 등급의 번호를 출력합니다.
문제에서 총 데이터 수는 4의 배수라고 정의하였으므로 4만큼 등급을 나누어 아래와 같이 풀이할 수 있습니다.

with t1 as (
    select id, ntile(4) over (order by size_of_colony desc) as colony_level
    from ecoli_data
)

select id, case
    when colony_level = 1 then 'CRITICAL'
    when colony_level = 2 then 'HIGH'
    when colony_level = 3 then 'MEDIUM'
    else 'LOW'
    end as colony_name
from t1
order by 1

ROW_NUMBER()

동등 순위를 인식하지 않고 매번 증가되는 번호를 출력합니다.
1 2 3 4 5

DENSE_RANK()

동등 순위는 같게 나오고 그 다음 순위를 다음 번호로 출력합니다.
1 2 3 3 4

RANK()

동등 순위는 같게 나오고 그 다음 순위를 다음 번호를 뺀 그 다음 번호로 출력합니다.
1 2 3 3 5

profile
's Coding Memory
post-custom-banner

0개의 댓글