1. 문제 풀이 아이디어
RANK()
함수로 내림차순 순위를 매기고COUNT(*) OVER()
로 전체 개수를 구한 후, 비율에 따라 그룹을 나눠 문제를 해결한다.
2. 나의 정답 코드
WITH ranks AS (
SELECT
id,
RANK() OVER (ORDER BY size_of_colony DESC) AS r,
COUNT(*) OVER () AS total_count
FROM ecoli_data
)
SELECT
id,
CASE
WHEN r * 1.0 / total_count <= 0.25 THEN 'CRITICAL'
WHEN r * 1.0 / total_count <= 0.5 THEN 'HIGH'
WHEN r * 1.0 / total_count <= 0.75 THEN 'MEDIUM'
ELSE 'LOW'
END AS colony_name
FROM ranks
ORDER BY id;
3. 정리
RANK() OVER (ORDER BY size_of_colony DESC)
를 사용하여 내림차순으로 순위를 매긴다.
COUNT(*) OVER ()
를 사용하여 전체 개수를 한 번만 계산하여 성능을 개선한다.
CASE
문에서r / total_count
의 비율을 기준으로 4개의 등급으로 나눈다.
ORDER BY id
를 적용하여 결과를id
기준으로 정렬한다.
Share article