-
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;
쿼리 흐름 설명
- 서브쿼리:
- 서브쿼리는 YEAR(DIFFERENTIATION_DATE)를 사용하여 연도별로 그룹화하고, 그 연도에서 가장 큰 대장균 크기(MAX(SIZE_OF_COLONY))를 구합니다.
- 각 연도별로 최대 크기를 MAX_SIZE라는 별칭으로 반환합니다.
- 메인 쿼리:
- 메인 쿼리에서는 ECOLI_DATA 테이블과 서브쿼리 결과를 JOIN하여, 각 대장균의 크기에서 해당 연도의 최대 크기를 빼고 크기 편차(YEAR_DEV)를 계산합니다.
- JOIN 조건은 YEAR(e.DIFFERENTIATION_DATE) = max_sizes.YEAR입니다. 즉, 대장균의 연도와 서브쿼리에서 구한 연도별 최대 크기를 기준으로 결합합니다.
- 정렬:
- ORDER BY YEAR, YEAR_DEV로 결과를 연도별로 오름차순 정렬하고, 같은 연도 내에서는 크기 편차(YEAR_DEV)를 기준으로 오름차순 정렬합니다.
반응형'MySQL_Programmers > Level2' 카테고리의 다른 글
Programmers - 물고기 종류 별 잡은 수 구하기 (0) 2025.04.01 Programmers - 월별 잡은 물고기 수 구하기 (0) 2025.03.28 Programmers - 특정 물고기를 잡은 총 수 구하기 (0) 2025.03.27 Programmers - 분기별 분화된 대장균의 개체 수 구하기 (0) 2025.03.26 Programmers - 부모의 형질을 모두 가지는 대장균 찾기 (0) 2025.03.20