For at beregne standardafvigelsen skal du iterere gennem alle elementerne, så det ville være umuligt at gøre dette i én forespørgsel. Den dovne måde ville være bare at gøre det i to omgange:
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
Endnu en simpel mulighed, som måske arbejde (temmelig almindeligt i analyse af videnskabelige data) ville være at droppe minimum og maksimum x værdier, som virker, hvis du har mange data at behandle. Du kan bruge ROW_NUMBER
at gøre dette i én erklæring:
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
)
Erstat ROW_NUMBER
med RANK
eller DENSE_RANK
hvis du vil kassere et vist antal unikke værdier.
Ud over disse simple tricks begynder du at komme ind i nogle ret tunge statistikker. Jeg skal forholde mig til lignende former for validering, og det er alt for meget materiale til et SO-indlæg. Der er hundrede forskellige algoritmer, som du kan justere på et dusin forskellige måder. Jeg vil prøve at holde det simpelt, hvis det er muligt!