Algorithm/Programmers SQL

[MySQL] 프로그래머스 연도별 대장균 크기의 편차 구하기

제우제우 2024. 9. 7. 12:26

https://school.programmers.co.kr/learn/courses/30/lessons/299310

 

프로그래머스

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

programmers.co.kr

코딩테스트 연습 > SUM, MAX, MIN > 연도별 대장균 크기의 편차 구하기 

문제 분석

난이도: LEVEL2

문제 요구사항

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

 

Self - Join을 통해서 문제해결 

(분화된 연도별 가장 큰 대장균의 크기) 해당 데이터를 얻을려면 셀프 조인이 필요하다. 

GROUP BY를 사용해서 연도별로 묶어주고 해당 연도에서 가장 큰 대장균의 크기를 구한다. 

SELECT MAX(SIZE_OF_COLONY) MAX_C, YEAR(DIFFERENTIATION_DATE) DATE
FROM ECOLI_DATA 
GROUP BY DATE

 

조인 

FROM 
ECOLI_DATA A 
JOIN
(
 SELECT MAX(SIZE_OF_COLONY) MAX_C, YEAR(DIFFERENTIATION_DATE) DATE
 FROM ECOLI_DATA 
 GROUP BY DATE
) C
ON YEAR(A.DIFFERENTIATION_DATE) = C.DATE

INNER JOIN 조건(ON): 연도

 

 

내가 틀렸던 부분 

문제에서 요구하는 분화된 연도(YEAR)의 타입은 INTEGER이다.

DATE_FORMAT(A.DIFFERENTIATION_DATE, '%Y'): return String 

YEAR(DIFFERENTIATION_DATE): return Integer 

정답 코드 

SELECT 
YEAR(A.DIFFERENTIATION_DATE) YEAR,
(C.MAX_C - A.SIZE_OF_COLONY) YEAR_DEV,
A.ID
FROM 
ECOLI_DATA A 
JOIN
(
 SELECT MAX(SIZE_OF_COLONY) MAX_C, YEAR(DIFFERENTIATION_DATE) DATE
 FROM ECOLI_DATA 
 GROUP BY DATE
) C
ON YEAR(A.DIFFERENTIATION_DATE) = C.DATE
ORDER BY 
YEAR(A.DIFFERENTIATION_DATE) ASC, 
YEAR_DEV ASC