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!