我正在收集页面加载时间并将它们存储在 SQL 表中。每分钟,我都想“汇总”这些统计信息,存储点击次数、平均加载时间和加载时间的标准偏差。
过了一会儿,我想按小时“汇总”这十分钟的间隔,保留总点击量、平均页面加载时间和“合并”标准偏差。
这是我编写的测试脚本的关键部分:
select
-- Pooled standard deviation
case when sum(NumHits) = 1
then null -- stddev is undefined when sample size = 1
else
sqrt(
(
sum(
(NumHits - 1) * square(StdDev) + NumHits * square(cast(AvgLoadTime as int))
) -
sum(NumHits) * square(sum(cast(NumHits as int) * AvgLoadTime) / sum(NumHits))
) / -- numerator
(
sum(NumHits) - 1
) -- denominator
)
end 'StdDev'
您还可以看到整个测试脚本的 SQL Fiddle。
汇总的标准差数学基于维基百科的这个方程:
我的问题是:
- 在 SQL 中计算合并标准差的最佳方法是什么?
- 它会扼杀性能吗?
更新:
添加了一条case
语句来处理所有样本大小的总和 = 1 的情况。在这种情况下,标准差未定义。