Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL:Durchschnitt und Min/Max innerhalb der Standardabweichungen anzeigen

Um die Standardabweichung zu berechnen, müssen Sie alle Elemente durchlaufen, sodass dies in einer einzigen Abfrage nicht möglich wäre. Der faule Weg wäre, es einfach in zwei Durchgängen zu machen:

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

Eine weitere einfache Option, die möglicherweise ist Arbeit (ziemlich üblich bei der Analyse wissenschaftlicher Daten) wäre es, das Minimum und Maximum x einfach wegzulassen Werte, was funktioniert, wenn Sie viele Daten verarbeiten müssen. Sie können ROW_NUMBER verwenden um dies in einer Anweisung zu tun:

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
)

Ersetzen Sie ROW_NUMBER mit RANK oder DENSE_RANK wenn Sie eine bestimmte Anzahl von einzigartigen verwerfen möchten Werte.

Über diese einfachen Tricks hinaus fangen Sie an, sich mit einigen ziemlich schweren Statistiken zu befassen. Ich muss mich mit ähnlichen Validierungen auseinandersetzen und das ist viel zu viel Material für einen SO-Beitrag. Es gibt hundert verschiedene Algorithmen, die Sie auf ein Dutzend verschiedene Arten optimieren können. Ich würde versuchen, es möglichst einfach zu halten!