Data Science/SQL

[프로그래머스 SQL] 데이터 타입 주의 할 것. (date는 left()-> X)

Tashapark 2025. 3. 2. 21:45
728x90

연도별 대장균 크기의 편차 구하기

 

수정 전

- 뭐가 문제일까..

- cte 집계함수 안된대서.. 유니언 안 하고 뺐는데..

with recursive cte as (
    select ID, left(DIFFERENTIATION_DATE, 4) as YEAR, SIZE_OF_COLONY
    FROM ECOLI_DATA
    )

select c.YEAR, 
        (max(e.SIZE_OF_COLONY)-min(e.SIZE_OF_COLONY)) as YEAR_DEV,
        e.ID        
    from ECOLI_DATA e
    join cte c
    where c.id = e.id
    order by YEAR, YEAR_DEV;

 

수정 후1

- WITH RECURSIVE → WITH로 변경 (재귀적이지 않음)

- JOIN에 ON 조건이 빠짐 → ON c.id = e.id 추가 => 이게 문제임

   - 여기서 e.ID = c.ID를 기준으로 조인하면, ID가 같은 레코드만 연결.

      즉, YEAR에 대한 정보가 없으므로 2020년의 레코드와 2021년의 레코드가 섞임

- ORDER BY에서 별칭 YEAR_DEV를 사용할 때 순서 조정 필요

WITH cte AS (
    SELECT 
        LEFT(DIFFERENTIATION_DATE, 4) AS YEAR, 
        MAX(SIZE_OF_COLONY) AS MAX_SIZE
    FROM ECOLI_DATA
    GROUP BY YEAR
)

SELECT 
    c.YEAR, 
    (c.MAX_SIZE - e.SIZE_OF_COLONY) AS YEAR_DEV, 
    e.ID
FROM ECOLI_DATA e
JOIN cte c ON LEFT(e.DIFFERENTIATION_DATE, 4) = c.YEAR -- 여기서 e.ID = c.ID를 기준으로 조인하면, ID가 같은 레코드만 연결.
ORDER BY c.YEAR, YEAR_DEV;

 

수정 후2

- 계속 틀려서 뭐지 하고, 다른 분들 답을 봤는데.. left()가 아니라 year()를 쓰심.. 

- date 형식이라서 문자형으로 쓰면 에러가 나는 것 같음...

- 또, min은 쓸 필요가 없음. 그냥 각각의 편차임.. => 문제를 제대로 읽을 것. 

WITH cte AS (
    SELECT 
        YEAR(DIFFERENTIATION_DATE) AS YEAR, -- date 타입이니깐 그냥 year()로
        MAX(SIZE_OF_COLONY) AS MAX_SIZE
    FROM ECOLI_DATA
    GROUP BY YEAR
)

SELECT 
    c.YEAR, 
    (c.MAX_SIZE - e.SIZE_OF_COLONY) AS YEAR_DEV, 
    e.ID
FROM ECOLI_DATA e
JOIN cte c ON YEAR(e.DIFFERENTIATION_DATE) = c.YEAR
ORDER BY c.YEAR, YEAR_DEV;
728x90
반응형