Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL :Afficher la moyenne et le min/max dans les écarts-types

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 !