0

SQL サーバーのデータ列に対して基本的な外れ値フィルターを実行する方法を探しています。

バックグラウンド

さまざまなアクションとそれらのアクションが発生した時刻を含むログ テーブルがあります。2 つの異なるログ イベント タイプ間の平均時間に関するデータを取得しようとしています。DATEDIFFこれらのイベント間の期間をキャプチャするために、単純なクエリ (タイムスタンプ間を使用) を使用しています。現在、AVG関数を使用して、発生しているこれら 2 つのイベントのペアになっているすべてのインスタンスの平均時間を取得しています。

問題

次の方法を使用して平均化する前に、データセットで外れ値フィルタリングを実行したいと思います。

Y is an outlier if Y < (Q1 - 1.5 * IQR) 
    OR
Y is an outlier if Y > (Q3 + 1.5 * IQR)

Where Q1 is the first quartile boundary value, 
      Q3 is the third quartile boundary value,
      and IQR is Q3 - Q1.

私の質問は最初です-SQLで四分位値を決定する最良の方法は何ですか?2番目-これを独自の集計関数として保存してフィルタリングしてから平均化する方法はありますか?

4

1 に答える 1

3

SQL Server 2005以降を使用していると仮定します。これは、実行する操作にウィンドウ関数が必要なためです。

select t.*
from t cross join
     (select min(y) as q1, max(y) as q3, max(y) - min(y) as iqr
      from (select y,
                   row_number() over (order by y) as seqnum,
                   count(*) over (partition by null) as total
            from t
           ) t
      where seqnum = cast(total*0.25 as int) or seqnum = cast(total*0.75 as int)
     ) qs
 where (y < q1 - 1.5*iqr) or (y > q3 + 1.5*iqr)

これがどのように機能するかについてのいくつかのメモ。qsサブクエリは、四分位数を明示的に計算しています。つまり、行を(yで)順序付けし、データの25%と75%の行にある値を取得します。比較では、シーケンス番号を行の合計に、小数部が整数にキャストバックされた回数を掛けたものと比較されることに注意してください。

group byは、計算ごとに、これらの値を1つの行に配置するだけです。where句は、除外を適用するロジックです。

于 2012-06-08T21:32:37.677 に答える