알고리즘 & 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 처리해서 문자열로 치환해주면 되겠군.