2016-03-21 16 views
0

以内に私は、SQL Server 2014SQL - フィルタリング窓関数

を使用している私は、グループの90パーセンタイルのすべての値の平均を取ることによって、データセット内のいくつかのノイズを除去しようとしています。

  • PARTITION人口の)平均(PARTITION人口の)

    • 90パーセンタイル値:

      SELECT 
          DISTINCT EventLocation, 
          PERCENTILE_CONT(.90) 
           WITHIN GROUP (ORDER BY (DATEDIFF(MINUTE, StartTime, EndTime)) ASC) 
           OVER (PARTITION BY EventLocation) 
           AS 'P90', 
          AVG(DATEDIFF(MINUTE, StartTime, EndTime)) 
           OVER (PARTITION BY EventLocation) 
           AS 'Mean' 
          FROM MyTable 
          ORDER BY N DESC 
      

      は現在2つの計算列がある:ここにクエリがあります私は別の列を追加したい:

      0 (PARTITION人口)
      • 値の平均<が(そのPARTITION人口の)90パーセンタイル値を=

      ような何か:私は正確にはわからない

      AVG(DATEDIFF(MINUTE, StartTime, EndTime)) 
          OVER (PARTITION BY EventLocation) 
          HAVING (DATEDIFF(MINUTE, StartTime, EndTime) <= [ 90th percentile value ]) 
          AS 'Mean90' 
      

      P90で定義されている90番目のパーセンタイル値を参照しているため、これにアプローチする方法...ユーザー定義の関数をグループ単位で適用したり、複数のテーブルを作成して結合したり、他の何か。

    +0

    この質問でSQLserver 2014を使用する場合は、タグmysql? – scaisEdge

    +1

    私はこのためにサブクエリまたはCTEを使用する必要があると思います。 –

    答えて

    0

    Gordon氏によると、CTEはこのような問題を解決する一般的な方法です。元のクエリの結果をCTEに保存してから、CTEのコンテンツを選択し、定義した列別名を使用して作業を追加します。

    ;WITH IntermediateResults AS (
        SELECT 
         DISTINCT EventLocation, 
         PERCENTILE_CONT(.90) 
          WITHIN GROUP (ORDER BY (DATEDIFF(MINUTE, StartTime, EndTime)) ASC) 
          OVER (PARTITION BY EventLocation) 
          AS 'P90', 
         AVG(DATEDIFF(MINUTE, StartTime, EndTime)) 
          OVER (PARTITION BY EventLocation) 
          AS 'Mean' 
        FROM MyTable 
        ORDER BY N DESC 
    ) 
    
    SELECT 
        *, 
        AVG(DATEDIFF(MINUTE, StartTime, EndTime)) 
         OVER (PARTITION BY EventLocation) 
         HAVING (DATEDIFF(MINUTE, StartTime, EndTime) <= P90) 
         AS 'Mean90' 
    FROM IntermediateResults