알고리즘 & SQL/프로그래머스

[프로그래머스 SQL] Lv3. 대장균의 크기에 따라 분류하기 2 (NTILE 없이)

양을 좋아하는 문씨 2025. 2. 14. 16:20

처음 푼 코드

더보기
더보기
with tbl
as (
    select
        ID,
        rank() over (order by SIZE_OF_COLONY desc) AS R
    from ECOLI_DATA
)

select
    tbl.ID,
    case
        when tbl.R / e.CNT <= 0.25 then "CRITICAL"
        when tbl.R / e.CNT <= 0.5 then "HIGH"
        when tbl.R / e.CNT <= 0.75 then "MEDIUM"
        else "LOW"
    end
    as COLONY_NAME
from tbl
join (
    select count(*) as CNT
    from ECOLI_DATA
) as e
order by ID;

나중에 고친 코드 (개인적으로는 좀 더 깔끔해졌다고 생각함)

더보기
더보기
with tbl
as (
    select
        ID,
        rank() over (order by SIZE_OF_COLONY desc) as r,
        (select count(*) from ECOLI_DATA) as cnt
    from ECOLI_DATA
)

select
    ID,
    case
        when r / cnt <= 0.25 then "CRITICAL"
        when r / cnt <= 0.5 then "HIGH"
        when r / cnt  <= 0.75 then "MEDIUM"
        else "LOW"
    end
    as COLONY_NAME
from tbl
order by ID;

핵심 아이디어는 이렇다.

1. 상위 몇 % 어쩌고... 랭킹을 찾아야 하니까 rank()가 필요하겠다.

2. 그리고 랭킹으로부터 일정 비율을 찾아내야 하니까 count(*) 를 통해 전체 개수를 구하는 작업이 있어야겠다.

3. 조건에 맞게 비율마다 case 처리해서 문자열로 치환해주면 되겠군.