카테고리 없음

Programmers - 대장균의 크기에 따라 분류하기 2(SQL 함수 2)

KJihun 2024. 4. 20. 17:42
728x90

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

대장균 개체의 크기를 내름차순으로 정렬했을 때

상위 0% ~ 25% 를 'CRITICAL',

26% ~ 50% 를 'HIGH',

51% ~ 75% 를 'MEDIUM',

76% ~ 100% 를 'LOW' 라고 분류합니다.

결과는 개체의 ID 에 대해 오름차순 정렬해주세요 .

총 데이터의 수는 4의 배수이며 같은 사이즈의 대장균 개체가 서로 다른 이름으로 분류되는 경우는 없습니다.

 

 

'CASE를 사용하여 해결하면 되겠다' 라는 생각으로 문제를 읽어나갔지만,

백분위로 데이터를 나누는 방법은 몰랐기에, 내가 알고있는 함수로는 풀 수 없다는걸 알 수 있었다.

그래서 구글링을 통하여, 백분위로 데이터를 나누는 방법을 찾아봤다.

아래의 4개의 함수들은 문제 해결을 위해 추가적으로 공부해야 했던 함수들이다.

 

 

 

WITH

하위 쿼리를 정의하고 해당 쿼리를 재사용할 때 사용함.


NTILE()

ORDER BY 절에 의해 정렬된 행을 주어진 수의 그룹으로 분할한다.

즉, 전체 행 수를 n 등분하여 그룹을 나눈다.

Percentiles CTE

WITH 절 내에서 정의되며 임시 결과 집합을 만든다.

이 경우, Percentiles CTE는 NTILE() 함수를 사용하여 대장균의 크기를 기준으로 백분위수를 계산하여 각 대장균을 해당 백분위 그룹으로 분류한다.

Classification CTE

WITH 절 내에서 정의되며, Percentiles CTE에서 계산된 백분위 그룹에 따라 대장균을 분류한다.

각 대장균 개체에 대해 해당하는 분류 (CRITICAL, HIGH, MEDIUM, LOW)를 지정한다.

 

 

 

WITH Percentiles AS (
  SELECT
    ID,
    NTILE(4) OVER (ORDER BY SIZE_OF_COLONY DESC) AS Percentile
  FROM
    ECOLI_DATA
),
Classification AS (
  SELECT
    ID,
    CASE
      WHEN Percentile = 1 THEN 'CRITICAL'
      WHEN Percentile = 2 THEN 'HIGH'
      WHEN Percentile = 3 THEN 'MEDIUM'
      WHEN Percentile = 4 THEN 'LOW'
    END AS COLONY_NAME
  FROM
    Percentiles
)
SELECT
  E.ID,
  C.COLONY_NAME
FROM
  ECOLI_DATA E
JOIN
  Classification C
ON
  E.ID = C.ID
ORDER BY
  E.ID;

 

 

 

함수의 흐름
1. WITH

하위 쿼리의 임시 결괏값을 만든 후 사용하기 위해 호출한다.

 

2. Percentiles CTE:

NTILE() 함수를 사용하여 대장균을 백분위 그룹으로 분류한다.

 

3. NTILE(): WITH 절 내의 Percentiles CTE에서 사용된다.

앞서 설명했듯이, ORDER BY 절에 따라 정렬된 행을 주어진 수의 그룹으로 분할한다.

NTILE(4)를 선언함으로써 결과를 4개의 그룹으로 분할하였다.

이후, 크기에 따라 내림차순으로 정렬하고, 각 대장균을 해당하는 백분위 그룹으로 할당하게 된다.

4.Classification CTE

Percentiles CTE에서 반환된 백분위 그룹을 기반으로 대장균을 분류하는 역할이다.

백분위 그룹이 1이면 "CRITICAL", 2면 "HIGH"로 분류한다.

 

 

익숙하지 않은 함수들이다. 관련된 문제들을 풀어 익힐 수 있도록 노력해야겠다.