시간 버킷(time_bucket) 이해하기
시간 버킷(time_bucket) 이해하기
시계열 데이터를 분석하다 보면 "5분 평균", "1시간 단위 합계"처럼 일정한 시간 간격으로 데이터를 묶어 보고 싶을 때가 많아요. TimescaleDB의 time_bucket 함수는 하이퍼테이블의 데이터를 원하는 시간 단위(예: 5분, 1시간, 3일) 버킷으로 묶어 집계하게 해 줘요. PostgreSQL의 date_bin 함수와 비슷하지만, 버킷 크기와 시작 시각을 더 유연하게 조절할 수 있어요.
시간 버킷이 동작하는 방식
시간 버킷팅은 데이터를 시간 간격 단위로 그룹화해요. time_bucket에서 간격 길이는 마이크로초, 밀리초, 초, 분, 시, 일, 주, 월, 년 중 무엇이든 될 수 있어요. 이 함수는 대개 GROUP BY와 함께 쓰여서, 각 버킷 안의 값들의 평균·최대·최소·합계 같은 집계를 계산해요.
Origin(기준점)
Origin은 시간 버킷이 언제 시작하고 끝나는지 정해요. 기본적으로 버킷은 데이터에서 가장 오래된 타임스탬프에서 시작하지 않아요. 더 논리적인 시각이 있는 경우가 많거든요. 예를 들어 첫 데이터 포인트를 00:37에 수집했더라도 일 단위 버킷은 자정에 시작하기를 원할 거예요. 수요일에 첫 데이터를 모았어도, 주 단위 버킷은 일요일이나 월요일부터 계산하기를 원하고요.
대신 시간은 origin에서부터 일정한 간격으로 나눠져요. 2주 버킷을 예로 들면, 버킷의 첫 가능한 시작 날짜는 origin이고 그다음 가능한 시작 날짜는 origin + 버킷 간격이에요. 첫 타임스탬프가 가능한 시작 날짜와 정확히 일치하지 않으면, 바로 앞선 시작 날짜를 버킷의 시작으로 써요.
예를 들어 데이터의 가장 오래된 타임스탬프가 2020년 4월 24일(금요일)이라고 해볼게요. 2주 간격으로 버킷하면 첫 버킷은 4월 24일이 아니라, 바로 앞선 월요일인 4월 20일도 아니에요. 이 경우 기본 origin이 2000년 1월 3일이라서, 거기서 2주 단위로 세어 도달할 수 있는 4월 13일에서 시작해요.
기본 Origin
월이나 년을 포함하지 않는 간격의 기본 origin은 2000년 1월 3일이에요. 월·년 간격은 2000년 1월 1일, 정수 시간 값은 0이 기본이에요.
이 선택은 버킷의 시간 범위를 더 직관적으로 만들어 줘요. 2000년 1월 3일은 월요일이므로 주 단위 버킷이 월요일에 시작해서 ISO 표준 달력 주 계산과 일치해요. 월·년 버킷은 2000년 1월 1일을 origin으로 써서 달력 월·년의 첫 날에 시작할 수 있어요. 다른 origin을 원하면 origin 파라미터로 직접 설정할 수 있어요. 예를 들어 주를 일요일부터 시작하려면 origin을 2000년 1월 2일(일요일)로 설정하면 돼요.
시간대(Timezone)
origin 시각은 시간 값의 데이터 타입에 따라 달라져요.
TIMESTAMP를 쓰면 기본적으로 버킷 시작 시각이00:00:00에 맞춰져요. 일·주 버킷은00:00:00에 시작하고, 더 짧은 버킷은 origin 날짜의00:00:00에서 버킷 간격으로 세어 도달하는 시각에 시작해요.TIMESTAMPTZ를 쓰면 기본적으로 버킷 시작 시각이00:00:00 UTC에 맞춰져요. 다른 시간대에 맞추려면timezone파라미터를 설정하면 돼요.
더 알아보기 (Learn more)
- 시간 버킷 사용하기: 그룹화·오프셋·계산용 SQL 예시
- 연속 집계 만들기: 시간 버킷 집계 미리 계산
time_bucket()레퍼런스: 모든 파라미터가 담긴 전체 API- 갭필링·보간:
time_bucket_gapfill()로 버킷 결과의 빈 구간 채우기