För att beräkna standardavvikelsen måste du iterera igenom alla element, så det skulle vara omöjligt att göra detta i en fråga. Det lata sättet skulle vara att bara göra det i två omgångar:
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
Ett annat enkelt alternativ som kan arbete (ganska vanligt vid analys av vetenskapliga data) skulle vara att bara släppa minsta och högsta x värden, vilket fungerar om du har mycket data att bearbeta. Du kan använda ROW_NUMBER
för att göra detta i ett uttalande:
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
)
Ersätt ROW_NUMBER
med RANK
eller DENSE_RANK
om du vill kassera ett visst antal unika värden.
Utöver dessa enkla knep börjar du komma in i ganska tung statistik. Jag måste hantera liknande typer av validering och det är alldeles för mycket material för ett SO-inlägg. Det finns hundra olika algoritmer som du kan justera på ett dussin olika sätt. Jag skulle försöka hålla det enkelt om möjligt!