Para calcular o desvio padrão, você precisa percorrer todos os elementos, portanto, seria impossível fazer isso em uma consulta. A maneira preguiçosa seria apenas fazê-lo em duas passagens:
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
Outra opção simples que pode trabalho (bastante comum na análise de dados científicos) seria apenas eliminar o mínimo e o máximo x valores, o que funciona se você tiver muitos dados para processar. Você pode usar
ROW_NUMBER
para fazer isso em uma declaração: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
)
Substituir
ROW_NUMBER
com RANK
ou DENSE_RANK
se você quiser descartar um certo número de exclusivos valores. Além desses truques simples, você começa a entrar em algumas estatísticas bem pesadas. Eu tenho que lidar com tipos semelhantes de validação e é muito material para um post SO. Existem centenas de algoritmos diferentes que você pode ajustar de uma dúzia de maneiras diferentes. Eu tentaria mantê-lo simples, se possível!