Aby obliczyć odchylenie standardowe, musisz przejść przez wszystkie elementy, więc nie byłoby to możliwe w jednym zapytaniu. Leniwym sposobem byłoby zrobienie tego w dwóch przejazdach:
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
Kolejna prosta opcja, która może pracy (dość powszechnej w analizie danych naukowych) byłoby po prostu odrzucenie minimum i maksimum x wartości, co działa, jeśli masz dużo danych do przetworzenia. Możesz użyć ROW_NUMBER
zrobić to w jednym oświadczeniu:
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
)
Zastąp ROW_NUMBER
z RANK
lub DENSE_RANK
jeśli chcesz odrzucić określoną liczbę unikalnych wartości.
Poza tymi prostymi sztuczkami zaczynasz mieć dość ciężkie statystyki. Mam do czynienia z podobnymi rodzajami walidacji i jest to zdecydowanie za dużo materiału na post SO. Istnieje sto różnych algorytmów, które możesz modyfikować na kilkanaście różnych sposobów. Jeśli to możliwe, staram się zachować prostotę!