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

求助:SQL Server中实现按日计算小时求和值的平均值

解决每日小时价格求和再取当日平均值的SQL方案

没问题,我来帮你搞定这个SQL需求!根据你的描述,我们需要分两步完成计算:先按小时汇总价格,再基于这些小时汇总值计算每日的平均值,而且要对表中每一天都执行这个逻辑。

假设你的表结构

首先我假设你的表名为product_prices,包含以下核心字段:

  • date_time:DATETIME类型,记录每条价格数据的具体时间(精确到小时及以下)
  • price:数值类型(比如DECIMAL或FLOAT),单条价格记录的值

完整SQL查询

这里用CTE(公共表表达式)来实现,代码可读性更高,也方便后续调整:

WITH hourly_totals AS (
    -- 第一步:按日期+小时分组,计算每小时的价格总和
    SELECT
        DATE(date_time) AS record_date,
        EXTRACT(HOUR FROM date_time) AS hour_of_day,
        SUM(price) AS hourly_sum
    FROM product_prices
    GROUP BY DATE(date_time), EXTRACT(HOUR FROM date_time)
)
-- 第二步:按日期分组,计算当日所有小时总和的平均值
SELECT
    record_date,
    ROUND(AVG(hourly_sum), 1) AS daily_avg_of_hourly_totals -- 保留1位小数匹配你的示例
FROM hourly_totals
GROUP BY record_date
ORDER BY record_date;

代码解释

  • CTE hourly_totals:

    • DATE(date_time):提取每条记录的日期部分,把同一天的记录归为一组
    • EXTRACT(HOUR FROM date_time):提取时间中的小时数,实现按小时聚合
    • SUM(price):计算每个小时内所有价格的总和
  • 外层查询:

    • AVG(hourly_sum):对当日所有小时的求和值取平均,得到你需要的当日平均值
    • ROUND(..., 1):保留1位小数,和你给出的示例结果337.6格式一致
    • ORDER BY record_date:按日期排序,方便查看每日结果

数据库兼容提示

不同数据库的日期函数可能略有差异,比如:

  • MySQL:可以用DATE(date_time)和HOUR(date_time)替代EXTRACT(HOUR FROM ...)
  • SQL Server:用CAST(date_time AS DATE)提取日期,DATEPART(HOUR, date_time)提取小时
  • Oracle:用TRUNC(date_time, 'DD')提取日期,TO_CHAR(date_time, 'HH24')提取小时

比如你给的示例中,假设当日有3个小时的求和值分别是300、350、363,那么AVG(300+350+363)就会得到337.6,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:24:25