2

我正在收集页面加载时间并将它们存储在 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

汇总的标准差数学基于维基百科的这个方程:

合并标准差方程

我的问题是:

  1. 在 SQL 中计算合并标准差的最佳方法是什么?
  2. 它会扼杀性能吗?

更新:

添加了一条case语句来处理所有样本大小的总和 = 1 的情况。在这种情况下,标准差未定义。

4

0 回答 0