ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Programmers - 연도별 대장균 크기의 편차 구하기
    MySQL_Programmers/Level2 2025. 3. 20. 16:47
    반응형

    문제 설명

    대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
    다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다. ECOLI_DATA 테이블의 구조는 다음과 같으며, ID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE 은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다.


    Column name Type Nullable
    ID INTEGER FALSE
    PARENT_ID INTEGER TRUE
    SIZE_OF_COLONY INTEGER FALSE
    DIFFERENTIATION_DATE DATE FALSE
    GENOTYPE INTEGER FALSE

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


    문제

     

    분화된 연도(YEAR), 분화된 연도별 대장균 크기의 편차(YEAR_DEV), 대장균 개체의 ID(ID) 를 출력하는 SQL 문을 작성해주세요. 분화된 연도별 대장균 크기의 편차는 분화된 연도별 가장 큰 대장균의 크기 - 각 대장균의 크기로 구하며 결과는 연도에 대해 오름차순으로 정렬하고 같은 연도에 대해서는 대장균 크기의 편차에 대해 오름차순으로 정렬해주세요.


    예시

    예를 들어 ECOLI_DATA 테이블이 다음과 같다면


    ID PARENT_ID SIZE_OF_COLONY DIFFERENTIATION_DATE GENOTYPE
    1 NULL 10 2019/01/01 5
    2 NULL 2 2019/01/01 3
    3 1 100 2020/01/01 4
    4 2 10 2020/01/01 4
    5 2 17 2020/01/01 6
    6 4 101 2021/01/01 22

    분화된 연도별 가장 큰 대장균의 크기는 다음과 같습니다.

    2019 : 10
    2020 : 100
    2021 : 101

    따라서 각 대장균의 분화된 연도별 대장균 크기의 편차는 다음과 같습니다.

    ID 1 : 10 - 10 = 0
    ID 2 : 10 -2 = 8
    ID 3 : 100 - 100 = 0

    ID 4 : 100 - 10 = 90
    ID 5 : 100 - 17 = 83
    ID 6 : 101 -101 - 0

    이를 분화된 연도에 대해 오름차순으로 정렬하고 같은 연도에 대해서는 대장균 크기의 편차에 대해 오름차순으로 정렬하면 결과는 다음과 같아야 합니다.


    YEAR YEAR_DEV ID
    2019 0 1
    2019 8 2
    2020 0 3
    2020 83 5
    2020 90 4
    2021 0 6

    문제 풀이

    이 문제는 대장균들의 분화 연도별로 각 대장균의 크기 편차를 계산하는 문제입니다. 각 대장균의 크기에서 해당 연도별 가장 큰 대장균의 크기를 빼면 크기 편차가 나오며, 이를 연도별로 오름차순으로 정렬하고, 같은 연도 내에서는 크기 편차를 기준으로 오름차순으로 정렬해야 합니다.

    쿼리 설명

     

    1. 연도별 가장 큰 대장균 크기 구하기

    • 먼저, 서브쿼리를 사용하여 연도별로 가장 큰 대장균의 크기(MAX(SIZE_OF_COLONY))를 계산합니다.
    • YEAR(DIFFERENTIATION_DATE)를 사용하여 연도별로 그룹화하고, 각 연도에서 가장 큰 크기를 구합니다. 이때 **GROUP BY YEAR(DIFFERENTIATION_DATE)**를 사용하여 연도별로 그룹화합니다.

    서브쿼리 예시:

    SELECT 
        YEAR(DIFFERENTIATION_DATE) AS YEAR,
        MAX(SIZE_OF_COLONY) AS MAX_SIZE
    FROM ECOLI_DATA
    GROUP BY YEAR(DIFFERENTIATION_DATE)
    • 이 서브쿼리는 각 연도별로 가장 큰 대장균 크기를 MAX_SIZE로 반환합니다.

    2. 메인 쿼리:

    • 메인 쿼리에서 서브쿼리의 결과(max_sizes)와 ECOLI_DATA 테이블을 JOIN하여, 각 대장균의 크기에서 그 연도에 해당하는 최대 크기를 뺀 크기 편차(YEAR_DEV)를 계산합니다.
    • YEAR(e.DIFFERENTIATION_DATE) = max_sizes.YEAR로 연도를 기준으로 두 테이블을 결합합니다.
    • 대장균의 크기에서 연도별 최대 크기를 빼는 연산을 통해 크기 편차를 구합니다.
    • max_sizes.MAX_SIZE - e.SIZE_OF_COLONY AS YEAR_DEV를 사용하여 각 대장균의 크기 편차를 계산합니다.

    3. 결과 정렬:

    • ORDER BY YEAR, YEAR_DEV를 사용하여 연도별로 오름차순 정렬하고, 같은 연도에 대해서는 크기 편차(YEAR_DEV)를 기준으로 오름차순 정렬합니다.

    SQL 쿼리

    SELECT 
        YEAR(e.DIFFERENTIATION_DATE) AS YEAR,
        max_sizes.MAX_SIZE - e.SIZE_OF_COLONY AS YEAR_DEV,
        e.ID
    FROM 
        ECOLI_DATA e
    JOIN 
        (SELECT 
            YEAR(DIFFERENTIATION_DATE) AS YEAR,
            MAX(SIZE_OF_COLONY) AS MAX_SIZE
        FROM ECOLI_DATA
        GROUP BY YEAR(DIFFERENTIATION_DATE)) max_sizes
    ON YEAR(e.DIFFERENTIATION_DATE) = max_sizes.YEAR
    ORDER BY YEAR, YEAR_DEV;

    쿼리 흐름 설명

    1. 서브쿼리:
      • 서브쿼리는 YEAR(DIFFERENTIATION_DATE)를 사용하여 연도별로 그룹화하고, 그 연도에서 가장 큰 대장균 크기(MAX(SIZE_OF_COLONY))를 구합니다.
      • 각 연도별로 최대 크기를 MAX_SIZE라는 별칭으로 반환합니다.
    2. 메인 쿼리:
      • 메인 쿼리에서는 ECOLI_DATA 테이블과 서브쿼리 결과를 JOIN하여, 각 대장균의 크기에서 해당 연도의 최대 크기를 빼고 크기 편차(YEAR_DEV)를 계산합니다.
      • JOIN 조건은 YEAR(e.DIFFERENTIATION_DATE) = max_sizes.YEAR입니다. 즉, 대장균의 연도와 서브쿼리에서 구한 연도별 최대 크기를 기준으로 결합합니다.
    3. 정렬:
      • ORDER BY YEAR, YEAR_DEV로 결과를 연도별로 오름차순 정렬하고, 같은 연도 내에서는 크기 편차(YEAR_DEV)를 기준으로 오름차순 정렬합니다.

     

     

    반응형

    댓글

Designed by Tistory.