Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL:Mostrar média e mín/máx dentro dos desvios padrão


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!