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

如何编写计算conc滚动24小时平均值的SQL查询用于Grafana可视化

Grafana conc字段24小时滚动平均值SQL实现

你之前直接调用avg()结果和原始conc值一致,是因为没有使用滑动窗口函数定义24小时的移动计算范围,普通聚合的avg()仅会按group by的分组逐组计算,不会包含历史24小时的全量数据。

PostgreSQL/TimescaleDB 适配写法(Grafana时序场景最常用)

SELECT
  -- 1m为你要展示的时间粒度,可按需调整为5m/1h等
  $__timeGroupAlias(time, '1m'),
  AVG(conc) OVER (
    ORDER BY time 
    RANGE BETWEEN INTERVAL '24 hours' PRECEDING AND CURRENT ROW
  ) AS conc_24h_avg
FROM 你的业务表名
-- Grafana内置宏,自动同步仪表盘的时间选择范围
WHERE $__timeFilter(time)
ORDER BY time

如果使用TimescaleDB,可将$__timeGroupAlias(time, '1m')替换为time_bucket('1m', time) AS time,查询性能更优。

MySQL 8.0+ 适配写法

WITH minute_agg AS (
  -- 先按1分钟粒度聚合原始数据,避免数据过密影响性能
  SELECT
    DATE_FORMAT(time, '%Y-%m-%d %H:%i:00') AS time,
    AVG(conc) AS minute_conc
  FROM 你的业务表名
  WHERE time BETWEEN $__timeFrom() AND $__timeTo()
  GROUP BY 1
)
SELECT
  time,
  AVG(minute_conc) OVER (
    ORDER BY UNIX_TIMESTAMP(time) 
    -- 86400为24小时对应的秒数
    RANGE BETWEEN 86400 PRECEDING AND CURRENT ROW
  ) AS conc_24h_avg
FROM minute_agg
ORDER BY time

注意事项

  • 可自行调整时间聚合粒度,比如需要按小时展示滚动平均值,将聚合逻辑里的1m替换为1h即可
  • 若需要过滤掉窗口不满24小时的结果,可以在最终查询中加条件time >= (SELECT MIN(time) + INTERVAL 24 HOUR FROM 你的业务表名)
  • 若原始数据时间间隔均匀,可省略预聚合步骤直接对原始数据开窗口计算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:45:04