Как рассчитать объединенное стандартное отклонение в 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 всего тестового скрипта.
Объединенная математика стандартного отклонения основана на этом уравнении из Википедии:
Мои вопросы:
- Каков наилучший способ расчета стандартного отклонения в пуле в SQL?
- Это убьет производительность?
Обновить:
Добавил case
оператор для обработки случаев, когда сумма всех размеров выборки = 1. В этом случае стандартное отклонение не определено.