SQL Server中从月度数据获取季度数据及聚合函数选择
如何从月度平均表计算季度平均响应速度
首先明确核心:AvgSpeedOfAnswerMonth是月度的平均响应速度(由avg(SpeedOfAnswer)计算而来),我们需要得到季度维度的真实平均响应速度,先逐个分析你纠结的选项:
错误选项分析
SUM(AvgSpeedOfAnswerMonth):这个操作是把季度内各月的平均响应速度直接相加,得到的是总和而非平均值,完全不符合需求,直接排除。AVG(SUM(AvgSpeedOfAnswerMonth)):语法错误。SUM是聚合函数,外层的AVG没有对应的分组逻辑,无法执行,排除。AVG(AvgSpeedOfAnswerMonth):这是简单算术平均,仅当每个月的样本量(比如每月产生的SpeedOfAnswer记录数)完全相同时,结果才准确。如果各月样本量差异大,这个结果会严重偏离真实的季度平均(比如一个月10条记录平均20,另一个月1000条记录平均25,简单平均是22.5,但真实平均约为24.95)。
正确方案
方案1:从原始数据直接计算(最优)
如果能访问存储每条SpeedOfAnswer记录的原始表,直接按季度计算平均是最准确的,避免二次聚合的误差:
SELECT 'Quarterly' AS TrendType, DATEADD(Q, DATEDIFF(Q, 0, Date), 0) AS TrendStartdate, AVG(SpeedOfAnswer) AS AvgSpeedOfAnswerQuarter FROM Original_Stats -- 替换为你的原始记录表名 GROUP BY DATEADD(Q, DATEDIFF(Q, 0, Date), 0) ORDER BY TrendStartdate
方案2:基于月度表的加权平均(次优)
如果只能使用Month_Stats表,需要补充每个月的样本量字段(比如RecordCount,记录该月有多少条SpeedOfAnswer数据),然后通过加权平均计算真实季度平均:
假设表已包含RecordCount字段:
SELECT 'Quarterly' AS TrendType, DATEADD(Q, DATEDIFF(Q, 0, Date), 0) AS TrendStartdate, SUM(AvgSpeedOfAnswerMonth * RecordCount) / SUM(RecordCount) AS AvgSpeedOfAnswerQuarter FROM Month_Stats GROUP BY DATEADD(Q, DATEDIFF(Q, 0, Date), 0) ORDER BY TrendStartdate
方案3:近似值(仅无其他选项时使用)
如果既没有原始表,也没有样本量字段,只能接受近似结果,才使用AVG(AvgSpeedOfAnswerMonth),但要明确这是一个简化的近似值,存在误差风险。
内容的提问来源于stack exchange,提问作者vissubabu
相关产品推荐
相关产品推荐

