[SQL] Programmers_SELECT. 대장균의 크기에 따라 분류하기 2

Programmers_SELECT. 대장균의 크기에 따라 분류하는 문제를 파헤쳐 보자 :)

May 4, 2026

1. 문제 설명

1-1. 테이블 설명

1-1-1. ECOLI_DATA 테이블

notion image
✔️ 최초의 대장균 개체의 PARENT_ID 는 NULL 값입니다.

1-2. 문제 설명

대장균 개체의 크기를 내름차순으로 정렬했을 때 상위 0% ~ 25% 를 'CRITICAL', 26% ~ 50% 를 'HIGH', 51% ~ 75% 를 'MEDIUM', 76% ~ 100% 를 'LOW' 라고 분류합니다.
대장균 개체의 ID(ID) 와 분류된 이름(COLONY_NAME)을 출력하는 SQL 문을 작성해주세요.
이때 결과는 개체의 ID에 대해 오름차순 정렬해주세요.
단, 총 데이터의 수는 4의 배수이며 같은 사이즈의 대장균 개체가 서로 다른 이름으로 분류되는 경우는 없습니다.

2. 문제 풀이

2-1. 최종 풀이

SELECT A.ID, CASE WHEN A.PERCENT <= 0.25 THEN 'CRITICAL' WHEN A.PERCENT <= 0.5 THEN 'HIGH' WHEN A.PERCENT <= 0.75 THEN 'MEDIUM' ELSE'LOW' END AS COLONY_NAME FROM (SELECT *, PERCENT_RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) AS PERCENT FROM ECOLI_DATA) A ORDER BY A.ID;

2-2. 단계별 풀이

2-2-1. 첫 번째 쿼리 (백분위 계산)

SELECT *, PERCENT_RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) AS PERCENT FROM ECOLI_DATA
📌
해당 코드를 실행하면, SIZE_OF_COLONY를 기준으로 개체 크기를 내림차순 정렬한 뒤 각 데이터의 백분위(PERCENT)를 계산한다.
📍 PERCENT_RANK() 함수
  • 데이터의 상대적인 순위를 0~1 사이 값으로 반환
  • 값이 작을수록 상위 그룹
  • 값이 클수록 하위 그룹
즉,
  • 상위 25% → 0.25 이하
  • 상위 50% → 0.5 이하
  • 상위 75% → 0.75 이하

2-2-2. 두 번째 쿼리 (서브쿼리 생성)

FROM ( SELECT *, PERCENT_RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) AS PERCENT FROM ECOLI_DATA ) A
📌
해당 코드를 실행하면, 백분위가 계산된 결과를 임시 테이블 A로 생성한다.
  • PARENT_ID IS NULL
    • → 부모가 없는 개체 = 최상위 개체
즉, 이후 메인 쿼리에서 A.PERCENT 값을 기준으로 등급을 분류할 수 있다.

2-2-3. 세 번째 쿼리 (등급 분류)

CASE WHEN A.PERCENT <= 0.25 THEN 'CRITICAL' WHEN A.PERCENT <= 0.5 THEN 'HIGH' WHEN A.PERCENT <= 0.75 THEN 'MEDIUM' ELSE 'LOW' END AS COLONY_NAME
📌
해당 코드를 실행하면, 백분위 값에 따라 군집의 위험도를 문자열로 변환한다.
📍분류 기준
  • 0 ~ 25% → CRITICAL
  • 25 ~ 50% → HIGH
  • 50 ~ 75% → MEDIUM
  • 75% 초과 → LOW
즉, 크기가 큰 군집일수록 높은 위험 등급을 부여한다.

2-2-4. 네 번째 쿼리 (최종 결과 조회)

SELECT A.ID, CASE WHEN A.PERCENT <= 0.25 THEN 'CRITICAL' WHEN A.PERCENT <= 0.5 THEN 'HIGH' WHEN A.PERCENT <= 0.75 THEN 'MEDIUM' ELSE 'LOW' END AS COLONY_NAME ORDER BY A.ID;
📌
해당 코드를 실행하면, 각 개체(ID)에 대해 백분위 기반 위험 등급(COLONY_NAME)을 부여하고 ID 기준으로 정렬하여 반환한다.

2-2-5. 최종 쿼리

SELECT A.ID, CASE WHEN A.PERCENT <= 0.25 THEN 'CRITICAL' WHEN A.PERCENT <= 0.5 THEN 'HIGH' WHEN A.PERCENT <= 0.75 THEN 'MEDIUM' ELSE 'LOW' END AS COLONY_NAME FROM ( SELECT *, PERCENT_RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) AS PERCENT FROM ECOLI_DATA ) A ORDER BY A.ID;
📌
해당 코드를 실행하면,
  • 군집 크기(SIZE_OF_COLONY)를 기준으로 백분위를 계산하고
  • 백분위에 따라 위험 등급(COLONY_NAME)을 부여한 뒤
  • 각 개체의 ID와 등급(COLONY_NAME)을 출력한다.