2012-04-13 7 views
2

平均処理時間の問題を解決するために取り組んでいます。私は本質的にデータの最高80%だけを平均して異常データを排除しようとしています。グループあたりの平均上位n個のSQL Server

私はグループごとの平均を実行するために、既存のトップNグループソリューションに適応しようとしています。ここではSQL Server 2008の

を使用すると、テーブルがどのように見えるかのサンプルです:

OpID | ProcessMin | Datestamp 
    2  | 234   | 2012-01-26 09:07:29.000 
    2  | 222   | 2012-01-26 10:04:22.000 
    3  | 127   | 2012-01-26 11:09:51.000 
    3  | 134   | 2012-01-26 05:02:11.000 
    3  | 566   | 2012-01-26 05:27:31.000 
    4  | 234   | 2012-01-26 04:08:41.000 

私はそれが OPIDためProcessMinの最低80%を取る、との平均を取りたいですその配列。どんな助けもありがとう!

* UPDATE *次のような表があると

:私はこの出力を期待

OpID ProcessMin Datestamp 
602 33   46:54.0 
602 36   38:59.0 
602 37   18:45.0 
602 39   22:01.0 
602 41   36:43.0 
602 42   33:00.0 
602 49   03:48.0 
602 51   22:08.0 
602 69   39:15.0 
602 105   59:56.0 
603 13   34:07.0 
603 18   07:17.0 
603 31   57:07.0 
603 39   01:52.0 
603 39   01:02.0 
603 40   40:10.0 
603 46   22:56.0 
603 47   11:03.0 
603 48   40:13.0 
603 56   25:01.0 

OptID ProcessMin 
602  41 
603  34.125 

お知らせその10個のデータポイントは、各OPID用があるので、最低8値(80%)のみを平均します。

+0

これは単なる別のサブクエリです。期待される結果とより多くのサンプルデータを示してください。その日の終わりにopidのちょうどグループ – JonH

+0

@ JonH - 上記の例として、いくつかのサンプルと出力を追加しました。サブクエリを実行しようとしましたが、Topがテーブル全体ではなく各OpIDのProcessMinのセットに適用されるようにロジックをセットアップすることに失敗しています。申し訳ありませんが、これはルーキーミスのビットかもしれません。私はこれが分割で達成できるかもしれないと思うが、私の試みは成功しなかった。 –

答えて

4

ProcessMinはあなたが小数の平均値を取得するためにavg(cast(ProcessMin as float)) as ProcessMinを行うことができますintegerされている場合は、ntile

select OpID, 
     avg(ProcessMin) as ProcessMin 
from 
    (
    select OpID, 
      ProcessMin, 
      ntile(5) over(partition by OpID order by ProcessMin) as nt 
    from YourTable 
) as T 
where nt <= 4 
group by OpID 

SE-Data

を使用することができます。

+0

ミカエル、完璧な男感謝多く! ntile(5)は本質的にデータセットを5つのセクションに分け、nt <= 4は最低の4/5 ==> 80%を含んでいますか? –

+0

@EricHill - そうだね。 –

+0

ありがとう、あなたは命を救う人です。私は最終的にどのように今もパーティションが動作するかを理解していると思います! –

関連する問題