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
반응형
'Data Science > SQL' 카테고리의 다른 글
[Elice SQL] null은 in, = 연산자로 못 씀.. is null 로 해 (0) | 2025.03.03 |
---|---|
[Elice SQL] 조인 join (0) | 2025.03.03 |
[Elice SQL] 집합연산자 & 계층형 질의 (0) | 2025.03.02 |
[Elice SQL] 다중행, 단일행 서브쿼리 (0) | 2025.03.01 |
[프로그래머스 sql] date_format()안 해도 month() 가능 (0) | 2025.02.26 |