You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite中按10分钟间隔统计30天传感器数据平均值的方法

解决SQLite中按10分钟窗口聚合传感器数据的问题

没问题,我帮你搞定这个时间窗口聚合的需求!针对你的sensor_values表,我们可以利用SQLite的日期函数来实现按10分钟分组计算平均值,同时只获取过去30天的数据。

核心思路

要实现10分钟窗口分组,关键是把每条记录的created_at时间戳截断到最近的10分钟边界(比如10:07的记录会被归到10:00-10:10的窗口,10:15的记录归到10:10-10:20的窗口),然后以这个边界时间作为分组依据,计算每个窗口内的value平均值。

完整SQL语句(适用于created_at为datetime字符串/ISO格式)

SELECT
  -- 生成10分钟窗口的起始时间作为分组标识
  strftime('%Y-%m-%d %H:%M:00', created_at, '-' || (strftime('%M', created_at) % 10) || ' minutes') AS window_start,
  -- 计算每个窗口的平均值
  AVG(value) AS avg_value
FROM sensor_values
WHERE
  -- 过滤过去30天的数据
  created_at >= datetime('now', '-30 days')
GROUP BY
  window_start
ORDER BY
  window_start ASC;

代码解释

  • 过滤条件:datetime('now', '-30 days')会自动计算当前时间往前推30天的时间,确保只查询目标时间段的数据。
  • 分组键生成:
    • strftime('%M', created_at) % 10 计算当前分钟数除以10的余数(比如07分的余数是7)
    • 用'-' || 余数 || ' minutes'生成一个时间偏移量,把当前时间往回推到最近的10分钟起始点
    • 最后用strftime格式化出标准的窗口起始时间(比如2024-05-20 14:00:00)
  • 聚合与排序:按窗口起始时间分组后计算平均值,最后按时间升序排列结果,方便查看趋势。

如果created_at是UNIX时间戳(整数)

如果你的created_at存储的是UNIX时间戳(比如1716220800这样的整数),只需要先把它转换成datetime格式再处理:

SELECT
  strftime('%Y-%m-%d %H:%M:00', datetime(created_at, 'unixepoch'), '-' || (strftime('%M', datetime(created_at, 'unixepoch')) % 10) || ' minutes') AS window_start,
  AVG(value) AS avg_value
FROM sensor_values
WHERE
  datetime(created_at, 'unixepoch') >= datetime('now', '-30 days')
GROUP BY
  window_start
ORDER BY
  window_start ASC;

性能优化建议

因为你的数据集很大,建议给created_at字段创建索引,大幅提升查询速度:

CREATE INDEX idx_sensor_created_at ON sensor_values(created_at);

内容的提问来源于stack exchange,提问作者Rodrigo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:48:07