ECOLI_DATA 테이블에서 연도별 대장균 크기의 편차(연도별 최대 크기 - 자신의 크기)를 구하는 문제이다. 연도 오름차순으로 정렬하고, 같은 연도 내에서는 편차 오름차순으로 정렬한다.
| 테이블 | 주요 컬럼 |
|---|---|
ECOLI_DATA | ID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE |
문제를 읽고 아래 3단계로 풀이 흐름을 정리하였다.
1단계 - 연도별 최대 크기 구하기
YEAR(DIFFERENTIATION_DATE)로 연도를 추출하고, GROUP BY로 묶어 연도별 MAX(SIZE_OF_COLONY)를 구한다.
SELECT YEAR(DIFFERENTIATION_DATE) AS Y, MAX(SIZE_OF_COLONY) AS MAX_SIZE
FROM ECOLI_DATA
GROUP BY YEAR(DIFFERENTIATION_DATE)
2단계 - 편차 계산
편차 = 연도별 최대 크기 - 자신의 크기이므로 MAX_SIZE - SIZE_OF_COLONY로 표현할 수 있다.
3단계 - 두 단계 합치기
1단계에서 구한 연도별 최대값을 서브쿼리로 만들고, 메인쿼리에서 JOIN으로 연결해 편차를 계산한다. 연결 기준은 연도가 같은 것이므로 YEAR(E.DIFFERENTIATION_DATE) = M.Y로 연결하면 된다.
구체적으로 정리한 풀이 흐름:
MAX(SIZE_OF_COLONY) 구하기JOINMAX_SIZE - SIZE_OF_COLONY AS DEVIATION으로 편차 계산ORDER BY YEAR ASC, DEVIATION ASC로 정렬SELECT YEAR(E.DIFFERENTIATION_DATE) AS YEAR,
MAX_SIZE - E.SIZE_OF_COLONY AS DEVIATION,
E.ID
FROM ECOLI_DATA E
JOIN (
SELECT YEAR(DIFFERENTIATION_DATE) AS Y,
MAX(SIZE_OF_COLONY) AS MAX_SIZE
FROM ECOLI_DATA
GROUP BY YEAR(DIFFERENTIATION_DATE)
) M ON YEAR(E.DIFFERENTIATION_DATE) = M.Y
ORDER BY YEAR ASC, DEVIATION ASC