DS가 되기 위한 여정 👩‍💻

Data Science/SQL

[프로그래머스 sql] date_format()안 해도 month() 가능

Tashapark 2025. 2. 26. 16:45
728x90
반응형

 

분기별 분화된 대장균의 개체 수 구하기

 

수정 전

- 이전에 했던 것들 참고해가면서.. 써봤는데.. 연습에선 돌아갔는 데 문제를 제출하면 계속 안 된다. 

WITH QUARTERS AS ( 
    SELECT ID, 
    NTILE(4) OVER (ORDER BY DATE_FORMAT(DIFFERENTIATION_DATE, '%m')) AS QUARTER
    FROM ECOLI_DATA
    )
SELECT
    CASE WHEN QUARTER = 1 THEN '1Q'
        WHEN QUARTER = 2 THEN '2Q'
        WHEN QUARTER = 3 THEN '3Q'
        ELSE '4Q' END AS QUARTER,
    COUNT(*) AS ECOLI_COUNT
FROM QUARTERS
GROUP BY QUARTER
ORDER BY QUARTER;

 

 

수정 후 

- ntile()를 쓰면 원하는 숫자만큼 나눌 수는 있지만, 

1. date_format은 문자형임. 정렬은 되지만 무자형으로 처리됨.

2. 리스트에 모든 달들이 들어있지 않으면, 4분기로 나눈다고 가정했을 때 엉뚱한 달이 분기에 배치 될 수 있음. 

 

수정 1

- 문자형을 숫자형으로 형변환-> cast()

- 근데 실패함.. 이 방법 자체를 안 쓰는 게 나을 듯. 

WITH QUARTERS AS ( 
    SELECT ID, 
    NTILE(4) OVER (ORDER BY CAST(DATE_FORMAT(DIFFERENTIATION_DATE, '%m') AS UNSIGNED)) AS QUARTER -- 형변환 시도 but, 실패
    FROM ECOLI_DATA 
    )
SELECT
    CASE WHEN QUARTER = 1 THEN '1Q'
        WHEN QUARTER = 2 THEN '2Q'
        WHEN QUARTER = 3 THEN '3Q'
        ELSE '4Q' END AS QUARTER,
    COUNT(*) AS ECOLI_COUNT
FROM QUARTERS
GROUP BY QUARTER
ORDER BY QUARTER;

 


수정 후 3

- 직접 기준 정하기

- 굳이 date_format()안해도 month()로 가지고 올 수 있음. 

SELECT
    CASE WHEN MONTH(DIFFERENTIATION_DATE) BETWEEN 1 AND 3 THEN '1Q' -- 그냥 바로 계산
        WHEN MONTH(DIFFERENTIATION_DATE) BETWEEN 4 AND 6 THEN '2Q' -- month()로 가지고 올 수 있음
        WHEN MONTH(DIFFERENTIATION_DATE) BETWEEN 7 AND 9 THEN '3Q'
        ELSE '4Q' END AS QUARTER,
    COUNT(*) AS ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY QUARTER
ORDER BY QUARTER;

 

728x90
반응형