Стандартное отклонение внутри группы в SQL или SSRS (альтернативно - расчет Sigma или Cpk) - PullRequest
1 голос
/ 28 октября 2011

У меня серьезная проблема с вычислением Стандартного отклонения в подгруппе в SSRS / SQl (что удобнее). Настоящая причина этого в том, что мне нужно вычислить значение Sigma (в соответствии с принципами Six Sigma) или, в качестве альтернативы, значение Cpk (возможности процесса), но мои усилия останавливаются на стандартном отклонении.

Я не силен в статистике, но кажется, что функции StDev и StDevP в SSRS (и SQL) не рассчитываются «в подгруппе», и я не могу найти функцию это могло бы сделать это. Ниже приведен снимок экрана Excel, показывающий этапы расчета, которых я хотел бы достичь в SQL / SSRS. Изменить: пока не можете публиковать изображения, пожалуйста, найдите ниже

enter image description here

Сложная часть вычисляет сумму абсолютных разностей между каждой парой значений. Порядок, в котором указаны значения, имеет значение. Я забыл упомянуть, что число 27 в знаменателе Rbar (строка 7) - это размер выборки минус 1 (27). Ниже также таблица в SQL:

DECLARE @Measurements TABLE(Val FLOAT)
INSERT INTO @Measurements (Val)(
    SELECT 485
    UNION ALL SELECT 490.6
    UNION ALL SELECT 490.6
    UNION ALL SELECT 485
    UNION ALL SELECT 485
    UNION ALL SELECT 489
    UNION ALL SELECT 485
    UNION ALL SELECT 477
    UNION ALL SELECT 477
    UNION ALL SELECT 484.6
    UNION ALL SELECT 484.6
    UNION ALL SELECT 484.6
    UNION ALL SELECT 484.6
    UNION ALL SELECT 485
    UNION ALL SELECT 484.6
    UNION ALL SELECT 484.6
    UNION ALL SELECT 485
    UNION ALL SELECT 485
    UNION ALL SELECT 477
    UNION ALL SELECT 484.6
    UNION ALL SELECT 484.6
    UNION ALL SELECT 484.6
    UNION ALL SELECT 484.6
    UNION ALL SELECT 484.6
    UNION ALL SELECT 484.6
    UNION ALL SELECT 482
    UNION ALL SELECT 482
    UNION ALL SELECT 482
)
SELECT STDEV(Val) FROM @Measurements 

Я предполагаю, что то, что мне нужно, может быть достигнуто с помощью RollingValue или некоторой хранимой процедуры в SSRS. Конечно, если есть более разумный способ подсчета Сигмы или Cpk, я буду очень рад услышать об этом.

Я надеюсь, что вопрос хорошо сформулирован, если нет, пожалуйста, прокомментируйте. Это очень важно для меня, поэтому я буду благодарен за любую помощь :) Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 ноября 2011

Стандартное отклонение можно рассчитать с помощью агрегатных функций SUM и COUNT:

STDEVP(x) := SQRT((SUM(x^2) - SUM(x)^2/COUNT(x)) / COUNT(x))
STDEV(x) := SQRT((SUM(x^2) - SUM(x)^2/COUNT(x)) / (COUNT(x) - 1))

Не самый точный способ, но он прост.

0 голосов
/ 02 ноября 2011

Я думаю, что это должно сработать?Не уверен, как был вычислен знаменатель 27 или значение d2, поэтому жестко запрограммировали их на данный момент ...

С точки зрения использования этого запроса важно сохранить порядок строк, поэтому я выбилзначения во временную таблицу с использованием столбца идентификаторов - если ваши значения взяты из таблицы и существуют фиксированные критерии для порядка, используйте row_number() OVER (order by criteria_column) вместо

IF OBJECT_ID('tempdb..#values') IS NOT NULL DROP TABLE #values
CREATE TABLE #values (row INT IDENTITY (1,1),val FLOAT)
INSERT INTO #values
    SELECT 485 as val
    UNION ALL SELECT 490.6 
    UNION ALL SELECT 490.6 
    UNION ALL SELECT 485 
    UNION ALL SELECT 485 
    UNION ALL SELECT 489 
    UNION ALL SELECT 485 
    UNION ALL SELECT 477 
    UNION ALL SELECT 477 
    UNION ALL SELECT 484.6 
    UNION ALL SELECT 484.6 
    UNION ALL SELECT 484.6 
    UNION ALL SELECT 484.6 
    UNION ALL SELECT 485 
    UNION ALL SELECT 484.6 
    UNION ALL SELECT 484.6 
    UNION ALL SELECT 485 
    UNION ALL SELECT 485 
    UNION ALL SELECT 477 
    UNION ALL SELECT 484.6 
    UNION ALL SELECT 484.6 
    UNION ALL SELECT 484.6 
    UNION ALL SELECT 484.6 
    UNION ALL SELECT 484.6 
    UNION ALL SELECT 484.6 
    UNION ALL SELECT 482 
    UNION ALL SELECT 482 
    UNION ALL SELECT 482 



;with stdevs AS
(
SELECT 
v1.val
,ABS(v1.val - v2.val) as abs_diff
,v2.val as value2
from #values v1
LEFT OUTER JOIN #values v2
ON v2.row = v1.row + 1
)
SELECT
avg(val) as average_value
,sum(abs_diff) as abs_sum
,sum(abs_diff) / 27 as Rbar
,1.13 as d2
,(sum(abs_diff) / 27) / 1.13 as std_dev
FROM stdevs
...