본문 바로가기
공부 일지/문제풀이

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

by Joshbla 2024. 11. 28.

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

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/301649

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

대장균들의 크기에 따라서 4가지 단계로 그룹을 매겨서 해당하는 단계를 출력하면된다.


문제 풀이

이문제를 풀려면 순위를 매기는 함수를 알아야 편해서 이번 기회에 공부했다.

 

NTILE

NTILE 함수는 숫자를 입력하면 해당 숫자만큼 단계를 나눠서 구분해준다.

예를 들어서 4를 입력하면 25%씩 나눠서 구분해준다.

SELECT ID,
CASE 
WHEN NTILE(1) OVER (order by SIZE_OF_COLONY) = 1 THEN 'A'
WHEN NTILE(2) OVER (order by SIZE_OF_COLONY) = 2 THEN 'B'
WHEN NTILE(3) OVER (order by SIZE_OF_COLONY) = 3 THEN 'C'
WHEN NTILE(4) OVER (order by SIZE_OF_COLONY) = 4 THEN 'D'
END as RK
FROM TABLE 
ORDER BY ID ASC;

 

0~25% 까지는 A

26~50% 까지는 B

51~75% 까지는 C

76~100% 까지는 D

( 오름차순, 내림차순을 잘 체크해야한다. )

 

RANK

RANK 함수는 순위를 전부 매겨준다.

SELECT ID, RANK() OVER (order by SIZE_OF_COLONY) AS RK
FROM TABLE 
ORDER BY ID ASC;
ID RANK
1 6
2 4
3 4
4 2
5 2
6 1

 

DENSE_RANK

RANK와는 다르게 공동순위를 넘지않는다.

SELECT ID, DENSE_RANK() OVER (order by SIZE_OF_COLONY) AS RK
FROM ECOLI_DATA 
ORDER BY ID ASC;
ID RANK
1 4
2 3
3 3
4 2
5 2
6 1

 

ROW_NUMBER

공동순위 자체를 무시한다.

SELECT ID, ROW_NUMBER() OVER (order by SIZE_OF_COLONY) AS RK
FROM ECOLI_DATA 
ORDER BY ID ASC;
ID RANK
1 6
2 4
3 5
4 2
5 3
6 1

 

구현

SELECT ID,
CASE 
WHEN NTILE(4) OVER (order by SIZE_OF_COLONY) = 1 THEN 'LOW'
WHEN NTILE(4) OVER (order by SIZE_OF_COLONY) = 2 THEN 'MEDIUM'
WHEN NTILE(4) OVER (order by SIZE_OF_COLONY) = 3 THEN 'HIGH'
ELSE 'CRITICAL'
END as COLONY_NAME
FROM ECOLI_DATA 
ORDER BY ID ASC;