求助: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
相关产品推荐
相关产品推荐

