ページの読み込み時間を収集し、SQL テーブルに保存しています。毎分、これらの統計を「ロールアップ」して、ヒット数、平均読み込み時間、読み込み時間の標準偏差を保存したいと考えています。
しばらくして、合計ヒット数、平均ページ読み込み時間、および「プールされた」標準偏差を維持しながら、これらの 10 分間隔を 1 時間ごとに「ロールアップ」したいと考えています。
以下は、私が作成したテスト スクリプトの重要な部分です。
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 の場合を処理するステートメントを追加しました。その場合、標準偏差は未定義です。