본문 바로가기

DataBase

[TimescaleDB documents] time_bucket()

Why?

영어 공부 및 지식 습득

Summary

  • time_bucket()을 이용하면, 시간 버킷을 단위로 데이터를 집계할 수 있다.

내용

TimescaleDB를 이용하면, time_bucket()함수를 사용 할 수 있는데, 이는 사용자가 원하는 시간 만큼 집계를 가능하게 한다. PostgreSQL의 date_bin() 함수와 비슷한데, 시작 시간과 버킷의 사이즈에 대해서 더 좋은 확장성을 가지고 있다.

 

시계열 데이터를 다루려면, 반드시 다운 샘플링(시간 빈도를 줄이는 것)이나 분석이 필요하다.

 

Bucketing이 동작하는 방식

time interval을 이용해서, 데이터를 그룹한다. time_bucket()함수는 interval length로 microseconds, milliseconds, seconds, minutes, hours, days, weeks, months, years, or centuries 를 사용 가능하다.

 

time_bucket()함수는 보통 데이터 집계를 위해서 group by와 함께 사용한다. 그래서 avg, min, max 등과 함께 쓰인다.

 

기본적으로 time bucket은 가지고 있는 데이터에서 가장 빠른 시간에서 시작하지 않는다. 예를 들면, 내가 데이터를 00:37 데이터를 가지고 있다고 하더라도, 00:00 부터 시작되기를 원할 수 있고, 첫번째 데이터가 wednesday이길 원할 수 있고, 주 단위 bucket을 원할 수도 있다.

 

bucket은 원점을 기준으로, 설정한 bucket interval만큼 작동한다. 따라서, 다음번 bucket 시작 날짜는 origin + bucket interval 이다.

만약, 첫번째 시작 날짜가 정확히 시작 가능한 날짜가 아니면, 정확한 시작이 가능한 이전 날짜로 동작한다.

 

말로 하면 좀 어려운데, 예를 들어보겠다.

2020년 4월 24일은 금요일이고, bucket interval은 2 week일때, 금요일은 주의 시작이 아니기 때문에, 4월 20일부터 시작할 것 같지만, default origin이 2000년 1월 3일 이기 때문에, 이때 부터 2주씩 계산하면, 2주의 시작은 4월 13일이다. 따라서, 4월 13일부터 2 week bucket이 생긴다.

 

default origin

위에서 default origin이라고 설명했는데, 이는 TimescaleDB가 기본적으로 설정한, origin이다. 이 default origin은 2000년 1월 3일이다. 그리고, 주의 시작을 월요일로 보는 이유는, ISO 표준에 의해서 주간은 월요일에 시작하기 때문이다.(헷갈리면 안되는게, 월간, 년간의 경우 2000년 1월 1일 부터 계산된다)

 

origin은 다음과 같이 변경이 가능하다. (만약, 주의 시작을 sunday로 하고 싶으면, 2000년 1월 2일로 설정하면 된다)

SELECT time_bucket('1 week', timetz, TIMESTAMPTZ '2017-12-31')

 

 

time zone

기본 time은 시간의 데이터 타입에 의존된다.

 

timestamp type의 경우, time zone이 없기 때문에, bucket time은 일일, 주간의 경우 00:00:00를 기준으로 시작한다. 일일 보다 짧은 time bucket일 경우, 00:00:00을 bucket 단위로 계산하여 도달할 수 있는 시간에 시작한다.

 

timestamptz의 경우, time zone이 있는 경우인데, 이는 00:00:00 UTC를 기준으로 시작한다.

timezone을 UTC에서 변경하고 싶은 경우 다음과 같이 변경 가능하다.

 

SELECT time_bucket('1 month', ts, 'Europe/Berlin') AS month_bucket