Как рассчитать объединенное стандартное отклонение в SQL?

Я собираю время загрузки страницы и храню их в таблице 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. В этом случае стандартное отклонение не определено.

0 ответов

Другие вопросы по тегам