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

如何在SQL中按每2小时间隔计算Value列的平均值?

按2小时时间间隔计算SQL表中Value的平均值

要实现按每2小时窗口(如12:00:00-13:59:59、14:00:00-15:59:59)计算平均值,核心是把timestamp字段归整到对应窗口的起始时间,再按这个归整后的时间分组求平均。以下是几种主流SQL方言的实现方案:

MySQL 实现

利用HOUR()函数提取小时数,通过取模运算把时间归到2小时窗口的起始点:

SELECT
  DATE_FORMAT(timestamp, '%Y-%m-%d %H:00:00') - INTERVAL (HOUR(timestamp) % 2) HOUR AS interval_start,
  AVG(Value) AS avg_value
FROM your_table_name
GROUP BY interval_start
ORDER BY interval_start;

逻辑说明:HOUR(timestamp) % 2得到当前小时除以2的余数,减去该余数对应的小时数,就能把任意时间映射到最近的偶数小时起始点(比如13:46会被调整为12:00,15:31调整为14:00)。

PostgreSQL 实现

通过EXTRACT()提取小时数,结合INTERVAL调整时间到窗口起始:

SELECT
  timestamp - INTERVAL '1 hour' * (EXTRACT(HOUR FROM timestamp) % 2) AS interval_start,
  AVG(Value) AS avg_value
FROM your_table_name
GROUP BY interval_start
ORDER BY interval_start;

也可以用date_trunc先截断到小时再调整:

SELECT
  date_trunc('hour', timestamp) - INTERVAL '1 hour' * (EXTRACT(HOUR FROM timestamp) % 2) AS interval_start,
  AVG(Value) AS avg_value
FROM your_table_name
GROUP BY interval_start
ORDER BY interval_start;

SQL Server 实现

用DATEPART()提取小时,通过整数除法确定窗口起始小时:

SELECT
  DATEADD(HOUR, (DATEPART(HOUR, timestamp) / 2) * 2, CAST(CAST(timestamp AS DATE) AS DATETIME)) AS interval_start,
  AVG(Value) AS avg_value
FROM your_table_name
GROUP BY DATEADD(HOUR, (DATEPART(HOUR, timestamp) / 2) * 2, CAST(CAST(timestamp AS DATE) AS DATETIME))
ORDER BY interval_start;

逻辑说明:DATEPART(HOUR, timestamp) / 2是整数除法,结果乘2后得到窗口的起始小时(比如13小时会计算为12,15小时计算为14),再和日期拼接成完整的窗口起始时间。

用你的示例数据测试时,上述代码会得到和你期望一致的核心结果,完整输出如下:

2022-09-17 12:00:00    2.5
2022-09-17 14:00:00    2.0
2022-09-17 16:00:00    2.3667
2022-09-17 18:00:00    2.6
2022-09-17 20:00:00    2.7

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:05:24