문제설명
대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다. ECOLI_DATA 테이블의 구조는 다음과 같으며, ID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE 은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다.
최초의 대장균 개체의 PARENT_ID는 NULL 값입니다.
문제
분화된 연도(YEAR), 분화된 연도별 대장균 크기의 편차(YEAR_DEV), 대장균 개체의 ID(ID)를 출력하는 SQL 문을 작성해 주세요.
분화된 연도별 대장균 크기의 편차는 분화된 연도별 가장 큰 대장균의 크기 - 각 대장균의 크기로 구하며 결과는 연도에 대해 오름차순으로 정렬하고 같은 연도에 대해서는 대장균 크기의 편차에 대해 오름차순으로 정렬해 주세요.
입출력 예 & 설명
예를 들어 ECOLI_DATA 테이블이 다음과 같다면
분화된 연도별 가장 큰 대장균의 크기는 다음과 같습니다.
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
이를 분화된 연도에 대해 오름차순으로 정렬하고 같은 연도에 대해서는 대장균 크기의 편차에 대해 오름차순으로 정렬하면 결과는 다음과 같아야 합니다.
나의 풀이
WITH 절을 사용하여 임시 연도별 가장 큰 대장균의 크기 집합을 생성해 줍니다.
MAX() 함수를 사용하여 대장균의 크기 중 MAX값을 MAX_SIZE로 지정해 주고, YEAR() 함수를 사용하여 연도만 가져옵니다.
MAX_SIZE_OF_COLONY를 조회해 보면 다음과 같습니다.
그리고 이제 대장균의 편차를 구해줘야 하는데, 위에서 만든 MAX_SIZE_OF_COLONY 테이블의 연도를 가져오고, "연도별 가장 큰 대장균"인 MAX_SIZE에서 각 연도의 대장균의 크기를 빼줘 편차를 구해줍니다.
INNER JOIN을 사용하여 조인하는 테이블의 ON 절의 조건이 일치하는 결과만 출력합니다. 이때 조건을 ED와 MS의 같은 연도를 기준으로 편차를 구해줍니다.
마지막으로 정렬을 해 마무리해 주었습니다.
쿼리를 보면 INNER JOIN인데 JOIN문이 보이지 않습니다.
이는 "함축 구문"이라고 부르는데, 단순히 from 절에 콤마 쓰면 inner join으로 치부됩니다.
함축구문을 사용하지 않으면 다음과 같습니다.
FROM 절에 INNER JOIN을 써주고, ON절에 JOIN을 할 조건을 적어줘야 합니다.
'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 없는 숫자 더하기 (Arrays.stream() anyMatch, sum(), Java) (1) | 2024.06.08 |
---|---|
[SQL] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기(MySQL) (0) | 2024.05.15 |
[프로그래머스] 짝지어 제거하기 (JavaScript) (1) | 2024.05.03 |
[SQL] 대장균들의 자식의 수 구하기 (MySQL) (0) | 2024.05.03 |
[프로그래머스] 최소직사각형 (JavaScript) (0) | 2024.05.02 |