2

平均処理時間を見つける問題に取り組んでいます。基本的に、データの最良の 80% のみを平均して、外れ値データを排除しようとしています。

グループごとの平均化を実行するために、既存のグループごとのトップ 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% を取得し、その配列の平均を取得します。どんな助けでも大歓迎です!

* アップデート *

次の表を考えます。

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

OpID ごとに 10 個のデータ ポイントがあるため、最低 8 個の値 (80%) のみを平均することに注意してください。

4

1 に答える 1

4

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-データ

ProcessMin が の場合、小数の平均値を取得integerできます。avg(cast(ProcessMin as float)) as ProcessMin

于 2012-04-13T19:27:10.373 に答える