Как рассчитать стандартное отклонение в SQL без встроенной функции
У меня есть столбец чисел в моей базе данных. Как я могу вычислить стандартное отклонение? Я не хочу использовать функцию stddev.
2 ответа
Просто потому, что мне было любопытно, я решил проверить фактический STDEV(). Теперь я не смог прибить встроенную функцию.
Я был близко... 0,000141009220002264 или 0,00748% скидка
Также, Total Average и Count должны быть преобразованы в float (дисперсия была больше с десятичной дробью)
Приведенный ниже пример приведен после моей таблицы ставок казначейства за 10-летнюю доходность (не то, чтобы это имело значение)
Select SQLFunction = Stdev([TR_Y10])
,ManualCalc = Sqrt(Sum(Power(((cast([TR_Y10] as float)-B.TotalAvg)),2) / B.TotalCnt))
,Variance = Stdev([TR_Y10]) - Sqrt(Sum(Power(((cast([TR_Y10] as float)-B.TotalAvg)),2) / B.TotalCnt))
From [Chinrus-Shared].[dbo].[DS_Treasury_Rates]
Join (Select TotalAvg=Avg(cast([TR_Y10] as float)),TotalCnt=count(*) From [Chinrus-Shared].[dbo].[DS_Treasury_Rates]) B on 1=1
Возвращает
SQLFunction ManualCalc Variance
1.88409468982299 1.88395368060299 0.000141009220002264
Стандартное отклонение - это квадратный корень дисперсии, деленный на n.
Дисперсия - это сумма квадратов разностей между средним и наблюдаемым значением.
Итак, в большинстве баз данных вы можете использовать оконные функции:
select sqrt(avg(var))
from (select square(t.x - avg(t.x) over ()) as var
from t
) t;
Заметки:
square()
Функция может иметь другое имя (например,power()
).sqrt()
Функция может иметь другое имя.- Это не очень хороший способ для расчета стандартного отклонения в целом. В частности, это численно нестабильный алгоритм (он будет отлично работать для конечного числа нормальных чисел).
- Подзапрос необходим, потому что оконные функции не могут быть аргументами функций агрегации.