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!