標準偏差を計算するには、すべての要素を反復処理する必要があるため、1 つのクエリでこれを行うことは不可能です。怠惰な方法は、2 つのパスでそれを行うことです:
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
可能性があるもう 1 つの簡単なオプション 作業 (科学データの分析ではかなり一般的) は、最小と最大の x を削除するだけです。 これは、処理するデータが大量にある場合に機能します。 ROW_NUMBER
を使用できます これを 1 つのステートメントで行うには:
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
)
ROW_NUMBER
を置き換えます RANK
で または DENSE_RANK
特定の数の unique を破棄したい場合
これらの単純なトリックを超えて、かなり重い統計に入り始めます。私は同様の種類の検証に対処する必要があり、SO の投稿にはあまりにも多くの資料があります。さまざまな方法で微調整できる 100 の異なるアルゴリズムがあります。できればシンプルにしようと思います!