За да изчислите стандартното отклонение, трябва да преминете през всички елементи, така че би било невъзможно да направите това в една заявка. Мързеливият начин би бил просто да го направите в две преминавания:
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 публикация. Има сто различни алгоритми, които можете да настройвате по дузина различни начини. Ще се опитам да го запазя просто, ако е възможно!