Afin de calculer l'écart type, vous devez parcourir tous les éléments, il serait donc impossible de le faire en une seule requête. La manière paresseuse serait de le faire en deux passes :
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
Une autre option simple qui pourrait travail (assez courant dans l'analyse de données scientifiques) serait de simplement laisser tomber le minimum et le maximum x valeurs, ce qui fonctionne si vous avez beaucoup de données à traiter. Vous pouvez utiliser ROW_NUMBER
pour le faire en une seule instruction :
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
)
Remplacer ROW_NUMBER
avec RANK
ou DENSE_RANK
si vous souhaitez supprimer un certain nombre d'éléments uniques valeurs.
Au-delà de ces astuces simples, vous commencez à entrer dans des statistiques assez lourdes. Je dois faire face à des types de validation similaires et c'est beaucoup trop de matériel pour un poste SO. Il existe une centaine d'algorithmes différents que vous pouvez modifier d'une douzaine de manières différentes. J'essaierais de faire simple si possible !