with MAXSIZEYEAR as (select max(SIZEOFCOLONY)as MAXSIZE,
DIFFERENTIATIONDATE
from ECOLIDATA
group by DIFFERENTIATIONDATE)
select extract(year from DIFFERENTIATIONDATE) as YEAR,
(MAXSIZE - SIZEOFCOLONY) as YEAR_DEV,
ID
from ECOLI_DATA
join MAXSIZEYEAR using (DIFFERENTIATION_DATE)
order by YEAR, YEAR_DEV asc;
위와 같이 쿼리를 작성했는데, 파티션으로 년도 별 계산이 안되어 샘플 케이스만 통과하고 테케가 다 나가네요.
cte 구문에서 max(SIZEOFCOLONY) over(partition by year(DIFFERENTIATION_DATE) 를 하면
집계 함수 오류가 발생하구요.
결국엔 더 간단한 쿼리로 문제를 통과했는데,
partition by 를 했을 때 max(sizeofcolony) 를 집계 함수를 쓰더라도
group by 로 묶이지 않은 컬럼에 대해서 쓸 수 없는 로직을 잘 모르겠습니다.
혹시 알려주실 수 있으신 분 있나 해서 글 작성합니다.
"cte 구문에서 max(SIZEOFCOLONY) over(partition by year(DIFFERENTIATION_DATE) 를 하면
집계 함수 오류가 발생하구요." 와 "partition by 를 했을 때 max(sizeofcolony) 를 집계 함수를 쓰더라도 group by 로 묶이지 않은 컬럼에 대해서 쓸 수 없는 로직을 잘 모르겠습니다." -- 라는 말씀은 WINDOW함수와 GROUP BY 를 함께 쓰시려고 하셨던것인지 헷갈립니다. 질문을 잘 이해하지 못했습니다ㅠㅠ... 혹시나 함께 쓰시려고 했다면 함께 동작하는 원리가 아니라는 것을 알아두시면 좋을 것 같습니다.
SQL에서 실행순서는 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 이며, GROUP BY 에서 행을 줄여버리는 집계를 사용하게 됩니다. 따라서 WINDOW 함수를 함께 사용할 수 있는 상황이 되지 않습니다. 만약 GROUP BY 결과에 대해서 WINDOW 함수를 사용하려면 서브쿼리로 넣은 뒤 사용할 수 있겠죠!
쓰신 쿼리를 통과하는 쿼리로 손보았습니다.
크게 수정된 부분은 세 가지 입니다.
with MAX_SIZE_YEAR as
(select YEAR(DIFFERENTIATION_DATE) AS YEAR,
max(SIZE_OF_COLONY) as MAX_SIZE
from ECOLI_DATA
group by YEAR(DIFFERENTIATION_DATE))
select extract(year from DIFFERENTIATION_DATE) as YEAR,
(MAX_SIZE - SIZE_OF_COLONY) as YEAR_DEV,
ID
from ECOLI_DATA e
LEFT JOIN MAX_SIZE_YEAR ON extract(year from e.DIFFERENTIATION_DATE) = MAX_SIZE_YEAR.YEAR
order by YEAR, YEAR_DEV asc;
max(SIZE_OF_COLONY) over(partition by year(DIFFERENTIATION_DATE) 쓰신 컬럼 자체는 잘못된 부분이 없습니다. 저도 마찬가지로 풀었구요! 이것을 사용하는 예시해답을 보여드리겠습니다.SELECT YEAR(differentiation_date) AS YEAR
, MAX(size_of_colony) OVER (PARTITION BY YEAR(differentiation_date)) -- here!
- size_of_colony AS YEAR_DEV
, id
FROM ECOLI_DATA
ORDER BY 1, 2;
도움이 되셨으면 좋겠습니다...!