Để tính toán độ lệch chuẩn, bạn cần phải lặp qua tất cả các phần tử, vì vậy sẽ không thể thực hiện điều này trong một truy vấn. Cách lười biếng sẽ là chỉ làm trong hai lần:
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
Một tùy chọn đơn giản khác có thể công việc (khá phổ biến trong phân tích dữ liệu khoa học) sẽ chỉ giảm mức tối thiểu và tối đa x giá trị này hoạt động nếu bạn có nhiều dữ liệu cần xử lý. Bạn có thể sử dụng ROW_NUMBER
để thực hiện điều này trong một tuyên bố:
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
)
Thay thế ROW_NUMBER
với RANK
hoặc DENSE_RANK
nếu bạn muốn loại bỏ một số duy nhất giá trị.
Ngoài những thủ thuật đơn giản này, bạn bắt đầu nhận được một số thống kê khá nặng. Tôi phải đối phó với các loại xác nhận tương tự và nó quá nhiều tài liệu cho một bài đăng SO. Có hàng trăm thuật toán khác nhau mà bạn có thể điều chỉnh theo hàng chục cách khác nhau. Tôi sẽ cố gắng giữ cho nó đơn giản nếu có thể!