Om de standaarddeviatie te berekenen, moet u alle elementen doorlopen, dus het zou onmogelijk zijn om dit in één query te doen. De luie manier zou zijn om het in twee stappen te doen:
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
Een andere eenvoudige optie die misschien werk (vrij gebruikelijk bij de analyse van wetenschappelijke gegevens) zou zijn om gewoon de minimale en maximale x te laten vallen waarden, wat werkt als u veel gegevens moet verwerken. U kunt ROW_NUMBER
. gebruiken om dit in één verklaring te doen:
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
)
Vervang ROW_NUMBER
met RANK
of DENSE_RANK
als je een bepaald aantal unieke wilt weggooien waarden.
Naast deze eenvoudige trucs begin je behoorlijk zware statistieken te krijgen. Ik heb te maken met soortgelijke soorten validatie en het is veel te veel materiaal voor een SO-post. Er zijn honderd verschillende algoritmen die je op tien verschillende manieren kunt aanpassen. Ik zou proberen het zo eenvoudig mogelijk te houden!