N-interval(N시간 간격) 데이터 처리하기
게시일 : 2024년 02월 19일
# Athena
# DuckDB
N-interval(N시간 간격) 데이터 처리하는 방법에 대해 간단히 정리해본다.
참고: stakoverflow를 보고 배웠으나 기존 링크를 찾을 수 없어서 참고자료로 남길 수 없음
SQL 기준 : ATHENA
DuckDB
기본 SQL
UNIT : minute, hour
N : 간격
date_trunc, [unit] : TIMESTAMP 데이터를 UNIT 시간에 맞게 변환하는 함수
date_trunc( [UNIT], TIMESTAMP ) - INTERVAL '1' [UNIT] * ( [UNIT](TIMESTAMP) % [N] )
5분 간격이라고 할 때, 해당 시간의 분을 5분으로 나눈 나머지 시간을 빼주면 된다.
24분 ==> 24분 - 4(24 % 5)분 => 20분
시간의 경우도 같은 원리로 가능하다. ( 3시간 간격 )
08시 ==> 08시 - 2(8 % 3)시 => 06시
분 간격
WITH time_table AS (
SELECT TIMESTAMP '2024-02-19 13:53:00' AS ts
UNION ALL
SELECT TIMESTAMP '2024-02-19 13:58:00' AS ts
UNION ALL
SELECT TIMESTAMP '2024-02-19 14:01:00' AS ts
)
SELECT ts, date_trunc('minute', ts) - interval '1' minute * (minute(ts) % 5) AS itv_ts
FROM time_table
데이터가 5분 간격으로 변환된 것을 확인할 수 있다.
ts | itv_ts |
---|---|
2024-02-19 13:58:00 | 2024-02-19 13:55:00 |
2024-02-19 13:53:00 | 2024-02-19 13:50:00 |
2024-02-19 14:01:00 | 2024-02-19 14:00:00 |
시간 간격
minute을 단순히 hour로만 변경하면 된다.
WITH time_table AS (
SELECT TIMESTAMP '2024-02-19 15:53:00' AS ts
UNION ALL
SELECT TIMESTAMP '2024-02-19 17:58:00' AS ts
UNION ALL
SELECT TIMESTAMP '2024-02-19 18:01:00' AS ts
)
SELECT ts, date_trunc('hour', ts) - interval '1' hour * (hour(ts) % 2) AS itv_ts
FROM time_table
데이터가 2시간 간격으로 변환된 것을 확인할 수 있다.
ts | itv_ts |
---|---|
2024-02-19 15:58:00 | 2024-02-19 14:00:00 |
2024-02-19 17:53:00 | 2024-02-19 16:00:00 |
2024-02-19 18:01:00 | 2024-02-19 18:00:00 |
활용
5분 간격 데이터 집계하기
WITH time_table AS (
SELECT TIMESTAMP '2024-02-19 15:31:00' AS ts
UNION ALL
SELECT TIMESTAMP '2024-02-19 15:33:00' AS ts
UNION ALL
SELECT TIMESTAMP '2024-02-19 15:36:00' AS ts
UNION ALL
SELECT TIMESTAMP '2024-02-19 15:37:00' AS ts
UNION ALL
SELECT TIMESTAMP '2024-02-19 15:38:00' AS ts
),
itv_time_table AS (
SELECT date_trunc('minute', ts) - interval '1' minute * (minute(ts) % 5) AS itv_ts
FROM time_table
)
SELECT itv_ts, COUNT(*) AS cnt
FROM itv_time_table
GROUP BY itv_ts
ORDER BY itv_ts
ts | cnt |
---|---|
2024-02-19 15:30:00 | 2 |
2024-02-19 15:35:00 | 3 |