MySQL多时间戳SUM()聚合查询及10秒时间窗口需求
解决方案
一、MySQL 端实现
1. 按原始时间戳直接聚合(无时间窗口)
如果仅需要对每个唯一的timestamp值求和,直接使用GROUP BY即可,SQL语句如下:
SELECT SUM(used) AS `sum(Used)`, timestamp FROM usage GROUP BY timestamp ORDER BY timestamp;
执行后会输出你期望的结果,将每个时间戳对应的used值求和汇总。
2. 10秒时间窗口聚合(覆盖延迟写入)
要覆盖cronjob的延迟写入需求,可通过将时间戳映射到所属的10秒区间起始点,再分组求和。利用UNIX_TIMESTAMP转换为秒数后取整实现:
SELECT SUM(used) AS `sum(Used)`, FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(timestamp) / 10) * 10) AS `window_timestamp` FROM usage GROUP BY FLOOR(UNIX_TIMESTAMP(timestamp) / 10) ORDER BY `window_timestamp`;
- 原理:把时间戳转为秒数后,除以10取整再乘10,得到该时间戳所属10秒窗口的起始时间(例如
2023-03-12 12:30:04会被映射到2023-03-12 12:30:00,2023-03-12 12:30:54映射到2023-03-12 12:30:50) - 该方式能把10秒内延迟写入的记录归到同一窗口,避免数据分散。
二、Grafana 端实现
如果数据最终用于Grafana展示,也可直接在Grafana中配置聚合,无需修改SQL:
- 配置并连接MySQL数据源
- 在面板查询编辑器中输入基础查询:
SELECT used, timestamp FROM usage - 在查询选项的Group by中,选择
time类型,设置间隔为10s - 选择聚合函数为
Sum,作用于used字段 - 保存配置后,Grafana会自动按10秒窗口聚合数据,适配可视化需求
这种方式更灵活,可根据展示需求随时调整时间窗口大小。
内容的提问来源于stack exchange,提问作者Chris W
相关产品推荐
相关产品推荐

