본문 바로가기
분석/데이터분석

[SQL] 주단위 집계 꼭!! 주의해야할 점 (presto, athena)

by 여우요원 2022. 6. 3.

이전 포스팅에서는 mysql 에서 주단위 집계시에 주의해야 할 점에 대해서 이야기 했었다. 
https://walkingfox.tistory.com/159

 

[MySql] 주단위 집계 꼭!! 주의해야할 점

쿼리(Query) 작업 시에 주 (Week) 단위로 집계를 해야한다면, 꼭 주의해야할 점이 하나 있다. 그것은 특정 일자가 어느 주에 속하는지에 따라서 다른년도의 주로 잘 못 계산되는 경우가 무척 많기 때

walkingfox.tistory.com

 

이번 글에서는 같은 내용을 presto 나 athena 에서 어떻게 처리할 지 이야기 해보겠다. 

 

presto 에서도 mysql에서와 같이 case when 구문을 이용하면 비슷한 방식으로 처리할 수 있지만, 역시나 sql 문장이 장황하게 길어진다. 

대신 presto 에서는 year_of_week(날짜) 라는 함수를 이용하면 쉽게 처리할 수 있다.

 

예를 들어서 2022년 01월 02일 (일요일) 은 주단위로는 2021년의 52번째 주에 해당이 되고, 

2022년 01월 03일 (월요일) 은 주단위로는 2022년의 1번째 주에 해당이 된다.

 

그래서 date_format(date('2022-01-02'), '%Y-%v') 는 2022-52 의 값을 

그리고 date_format(date('2022-01-03'), '%Y-%v') 는 2022-01 의 값을 출력하여 1월 2일의 경우 잘못된 주로 계산이 되기 쉽다.

 

그런데 presto 의 year_of_week 함수를 사용하면 아래와 같이 자동으로 해당 주의 연도를 계산해준다. 

year_of_week(date('2022-01-02')) 는 2021 로 

year_of_week(date('2022-01-03')) 는 2022 로 값을 반환한다.

 

아래와 같이 concat 으로 문자열을 묶어주면 연도(yyyy)-w주번호 의 형태로 쉽게 계산 할 수 있다.

select concat(cast(year_of_week(date'2022-01-02') as varchar), date_format(date'2022-01-02', '-w%v')) as week1 
    , concat(cast(year_of_week(date'2022-01-03') as varchar), date_format(date'2022-01-03', '-w%v')) as week2

 

 

[참고]

athena 에서는 mysql 에서 사용하는 format string 을 거의 그대로 지원하지만, 아래의 것은 아직 지원되지 않고 있다.

The following specifiers are not currently supported: %D %U %u %V %w %X