Untuk menghitung simpangan baku, Anda perlu mengulangi semua elemen, jadi tidak mungkin melakukan ini dalam satu kueri. Cara malasnya adalah melakukannya dalam dua lintasan:
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
Opsi sederhana lainnya yang mungkin pekerjaan (cukup umum dalam analisis data ilmiah) adalah dengan hanya menjatuhkan x minimum dan maksimum nilai, yang berfungsi jika Anda memiliki banyak data untuk diproses. Anda dapat menggunakan ROW_NUMBER
untuk melakukan ini dalam satu pernyataan:
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
)
Ganti ROW_NUMBER
dengan RANK
atau DENSE_RANK
jika Anda ingin membuang sejumlah unik . tertentu nilai.
Di luar trik sederhana ini, Anda mulai mendapatkan beberapa statistik yang cukup berat. Saya harus berurusan dengan jenis validasi yang serupa dan itu terlalu banyak materi untuk posting SO. Ada ratusan algoritme berbeda yang dapat Anda sesuaikan dengan selusin cara berbeda. Saya akan mencoba membuatnya tetap sederhana jika memungkinkan!