如何在BigQuery中使用SQL实现每5秒的数据聚合?
BigQuery 按5秒间隔统计总数量的两种实现方案
数据表结构与示例数据
| id | quantity | created_at |
|---|---|---|
| 1 | 100 | 2023-08-09 1:32:23.123456 |
| 2 | 150 | 2023-08-09 1:32:26.123456 |
| 3 | 110 | 2023-08-09 1:32:27.123456 |
| 4 | 10 | 2023-08-09 1:32:28.123456 |
| 5 | 10 | 2023-08-09 1:33:18.123456 |
| 6 | 10 | 2023-08-09 1:33:20.123456 |
期望输出
| timestamp_interval_5sec | total_quantity |
|---|---|
| 2023-08-09 1:32:20 | 100 |
| 2023-08-09 1:32:25 | 270 |
| 2023-08-09 1:33:15 | 10 |
| 2023-08-09 1:33:20 | 10 |
方案一:使用TIMESTAMP_TRUNC函数(常规时间截断方案)
利用BigQuery内置的TIMESTAMP_TRUNC函数直接将时间戳截断到5秒间隔,再通过GROUP BY汇总数量:
SELECT TIMESTAMP_TRUNC(created_at, SECOND, INTERVAL 5 SECOND) AS timestamp_interval_5sec, SUM(quantity) AS total_quantity FROM `your-project.your-dataset.your-table` GROUP BY timestamp_interval_5sec ORDER BY timestamp_interval_5sec;
说明:
TIMESTAMP_TRUNC(created_at, SECOND, INTERVAL 5 SECOND)指定将created_at按5秒为单位截断,生成每个记录所属的5秒区间起始时间- 按截断后的时间区间分组,汇总该区间内的
quantity总和
方案二:结合PARTITION BY与GROUP BY实现
通过时间戳的秒数计算确定5秒区间,同时使用PARTITION BY按日期分区(可优化大表查询性能),再通过GROUP BY汇总:
SELECT timestamp_interval_5sec, SUM(quantity) AS total_quantity FROM ( SELECT quantity, -- 计算当前时间戳所属的5秒区间起始时间 TIMESTAMP_SECONDS(UNIX_SECONDS(created_at) - MOD(UNIX_SECONDS(created_at), 5)) AS timestamp_interval_5sec, DATE(created_at) AS date_part FROM `your-project.your-dataset.your-table` ) GROUP BY date_part, timestamp_interval_5sec -- 按日期分区,提升大表查询效率 PARTITION BY date_part ORDER BY timestamp_interval_5sec;
说明:
- 子查询中通过
UNIX_SECONDS将时间戳转换为秒数,用MOD计算当前秒数与5的余数,减去余数后得到5秒区间的起始秒数,再转回时间戳 - 外层查询按日期(
date_part)分区,同时按5秒区间分组,汇总数量总和 PARTITION BY在这里主要用于优化大表查询,让BigQuery按日期并行处理数据,也可以根据实际需求调整分区维度(如小时)
内容的提问来源于stack exchange,提问作者Titu
相关产品推荐
相关产品推荐

