Чтобы рассчитать стандартное отклонение, вам нужно выполнить итерацию по всем элементам, поэтому было бы невозможно сделать это за один запрос. Ленивым способом было бы просто сделать это в два прохода:
DECLARE
@Avg int,
@StDev int
SELECT @Avg = AVG(Sales), @StDev = STDEV(Sales)
FROM tbl_sales
WHERE ...
SELECT AVG(Sales) AS AvgSales, MAX(Sales) AS MaxSales, MIN(Sales) AS MinSales
FROM tbl_sales
WHERE ...
AND Sales >= @Avg - @StDev * 3
AND Sales <= @Avg + @StDev * 3
Еще один простой вариант, который может работать (довольно часто используется при анализе научных данных), заключается в том, чтобы просто отбросить минимальное и максимальное значения x , что работает, если у вас данные для обработки. Вы можете использовать ROW_NUMBER
, чтобы сделать это в одном выражении:
WITH OrderedValues AS
(
SELECT
Sales,
ROW_NUMBER() OVER (ORDER BY Sales) AS RowNumAsc,
ROW_NUMBER() OVER (ORDER BY Sales DESC) AS RowNumDesc
)
SELECT ...
FROM tbl_sales
WHERE ...
AND Sales >
(
SELECT MAX(Sales)
FROM OrderedValues
WHERE RowNumAsc <= @ElementsToDiscard
)
AND Sales <
(
SELECT MIN(Sales)
FROM OrderedValues
WHERE RowNumDesc <= @ElementsToDiscard
)
Замените ROW_NUMBER
на RANK
или DENSE_RANK
, если вы хотите отбросить определенное количество уникальных значений.
Помимо этих простых трюков, вы начинаете получать довольно тяжелую статистику. Мне приходится иметь дело с подобными видами валидации, и это слишком много материала для поста SO. Существуют сотни различных алгоритмов, которые вы можете настроить десятком различных способов. Я бы постарался сделать это простым, если это возможно!