Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL:mostra la media e il minimo/massimo entro le deviazioni standard

Per calcolare la deviazione standard, è necessario scorrere tutti gli elementi, quindi sarebbe impossibile farlo in una query. Il modo pigro sarebbe farlo in due passaggi:

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

Un'altra semplice opzione che potrebbe lavoro (abbastanza comune nell'analisi dei dati scientifici) consisterebbe semplicemente nell'abbassare il minimo e il massimo x valori, che funziona se hai molti dati da elaborare. Puoi utilizzare ROW_NUMBER per farlo in una sola affermazione:

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
)

Sostituisci ROW_NUMBER con RANK o DENSE_RANK se vuoi scartare un certo numero di unici valori.

Al di là di questi semplici trucchi, inizi a entrare in alcune statistiche piuttosto pesanti. Ho a che fare con tipi simili di convalida ed è troppo materiale per un post SO. Esistono centinaia di algoritmi diversi che puoi modificare in una dozzina di modi diversi. Cercherei di mantenerlo semplice, se possibile!