-
Programmers - 분기별 분화된 대장균의 개체 수 구하기MySQL_Programmers/Level2 2025. 3. 26. 15:15반응형
문제 설명
대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 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 값입니다.
문제
각 분기(QUARTER)별 분화된 대장균의 개체의 총 수(ECOLI_COUNT)를 출력하는 SQL 문을 작성해주세요. 이때 각 분기에는 'Q' 를 붙이고 분기에 대해 오름차순으로 정렬해주세요. 대장균 개체가 분화되지 않은 분기는 없습니다.
예시
예를 들어 ECOLI_DATA 테이블이 다음과 같다면
ID PARENT_ID SIZE_OF_COLONY DIFFERENTIATION_DATE GENOTYPE 1 NULL 10 2019/01/01 5 2 NULL 2 2019/05/01 3 3 1 100 2020/01/01 4 4 2 17 2022/04/01 4 5 2 10 2020/09/01 6 6 4 101 2021/12/01 22 각 분기별로 분화된 대장균 개체는 다음과 같습니다.
1분기 : ID 1, ID 3
2분기 : ID 2, ID 4
3분기 : ID 5
4분기 : ID 6따라서 결과는 다음과 같아야 합니다
QUARTER ECOLI_COUNT 1Q 2 2Q 2 3Q 1 4Q 1
전체 쿼리 해석
SELECT CONCAT(QUARTER, 'Q') AS QUARTER, COUNT(*) AS ECOLI_COUNT FROM ( SELECT EXTRACT(QUARTER FROM DIFFERENTIATION_DATE) AS QUARTER FROM ECOLI_DATA ) AS subquery GROUP BY QUARTER ORDER BY QUARTER;
1. 서브쿼리 (subquery)
SELECT EXTRACT(QUARTER FROM DIFFERENTIATION_DATE) AS QUARTER FROM ECOLI_DATA
- 목적: ECOLI_DATA 테이블에서 각 대장균 개체의 DIFFERENTIATION_DATE (분화 날짜) 컬럼을 이용해 분기를 추출합니다.
- EXTRACT(QUARTER FROM DIFFERENTIATION_DATE):
- 이 함수는 DIFFERENTIATION_DATE에서 분기(1분기, 2분기, 3분기, 4분기)를 추출합니다. 예를 들어, 날짜가 2020-01-01이라면 1분기에 해당하므로 1이 추출됩니다.
- 이 서브쿼리는 QUARTER라는 별칭을 사용하여 각 대장균 개체가 속한 분기를 반환합니다.
2. 외부 쿼리 (Main query)
SELECT CONCAT(QUARTER, 'Q') AS QUARTER, COUNT(*) AS ECOLI_COUNT FROM ( -- 서브쿼리 ) AS subquery GROUP BY QUARTER ORDER BY QUARTER;
- CONCAT(QUARTER, 'Q'):
- 이 부분은 각 분기의 숫자 뒤에 'Q'를 붙여 1Q, 2Q, 3Q, 4Q 형식으로 출력하는 역할을 합니다.
- 예를 들어, 분기가 1이면 '1Q'로 출력됩니다.
- COUNT(*):
- COUNT(*)는 각 분기별로 대장균 개체 수를 셉니다. 즉, QUARTER 값이 동일한 레코드를 그룹화하여 개체의 개수를 계산합니다.
- GROUP BY QUARTER:
- QUARTER를 기준으로 그룹화하여 각 분기별로 대장균 개체 수를 계산합니다. QUARTER 값에 따라 동일한 값의 개체들을 묶고, 그 개체 수를 세는 방식입니다.
- ORDER BY QUARTER:
- 결과를 분기 순서대로 오름차순 정렬합니다. 1Q, 2Q, 3Q, 4Q 순으로 출력됩니다.
전체적인 흐름
- 서브쿼리에서 각 DIFFERENTIATION_DATE 값으로부터 분기를 추출합니다.
- 추출된 분기 정보를 외부 쿼리에서 그룹화하여 각 분기별 개체 수를 셉니다.
- 결과를 1Q, 2Q, 3Q, 4Q와 같은 형식으로 출력하고, 분기 순으로 정렬하여 최종 결과를 도출합니다.
결론
이 쿼리는 서브쿼리를 사용하여 EXTRACT된 분기 값을 먼저 계산한 후, 그 값을 외부 쿼리에서 그룹화하여 대장균 개체의 수를 세는 방식으로 ONLY_FULL_GROUP_BY 모드에서 발생할 수 있는 오류를 회피하면서 정확한 결과를 도출합니다.
반응형'MySQL_Programmers > Level2' 카테고리의 다른 글
Programmers - 물고기 종류 별 잡은 수 구하기 (0) 2025.04.01 Programmers - 월별 잡은 물고기 수 구하기 (0) 2025.03.28 Programmers - 특정 물고기를 잡은 총 수 구하기 (0) 2025.03.27 Programmers - 연도별 대장균 크기의 편차 구하기 (0) 2025.03.20 Programmers - 부모의 형질을 모두 가지는 대장균 찾기 (0) 2025.03.20