sql >> データベース >  >> RDS >> Sqlserver

SQL:標準偏差内の平均と最小/最大を表示

    標準偏差を計算するには、すべての要素を反復処理する必要があるため、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 の異なるアルゴリズムがあります。できればシンプルにしようと思います!



    1. 「関連する質問」エンジンを構築する方法は?

    2. PHPを介してMySQLにテキストとしてHTML選択値を挿入する方法

    3. 無視を挿入-ステートメントが無視されたかどうかを知る方法はありますか? MYSQL

    4. 左結合を使用したMySQLクエリは非常に遅い