하루에 sql 꼭 하나씩 풀기를.. D+1
코딩테스트 연습 > SELECT > 대장균 크기에 따라 분류하기 2
대장균 개체의 크기(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
다른 순위함수를 알아보겠습니다.
지정된 수 만큼의 등급으로 나누어 각 등급의 번호를 출력합니다.
문제에서 총 데이터 수는 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
동등 순위를 인식하지 않고 매번 증가되는 번호를 출력합니다.
1 2 3 4 5
동등 순위는 같게 나오고 그 다음 순위를 다음 번호로 출력합니다.
1 2 3 3 4
동등 순위는 같게 나오고 그 다음 순위를 다음 번호를 뺀 그 다음 번호로 출력합니다.
1 2 3 3 5