質問

私たちは、列の平均値を取得する必要があり、このデータのセットを持っています。 select avg(x) from yは、トリックを行います。しかし、我々は、より正確な数値を必要としています。

私たちは平均を計算するには、それらを除外することができるように高すぎる、または低すぎる値(スパイク)のいずれかを持っているフィルタリングレコードの方法がなければならないことを考え出します。

役に立ちましたか?

解決

平均の3種類があります、そしてあなたが元々使用していることは平均値である - 。値の数で割ったすべての値の合計

あなたはそれがより便利なモードを取得するために見つけるかもしれない - 最も頻繁にoccuring値:

select name,    
       (select top 1 h.run_duration
        from sysjobhistory h
        where h.step_id = 0
        and h.job_id = j.job_id
        group by h.run_duration
        order by count(*) desc) run_duration
from sysjobs j

あなたは、元の標準偏差外の任意の値を取り除きたいなかった場合は、範囲外にあるこれらの値を排除し、サブクエリで平均値と標準偏差を見つけることができる:平均+ - 標準偏差、その後はやりますさらに残りの値の平均が、あなたは意味のない値を持つことのリスクを実行を開始ます:

select oh.job_id, avg(oh.run_duration) from sysjobhistory oh
inner join (select job_id, avg(h.run_duration) avgduration, 
            stdev(h.run_duration) stdev_duration 
            from sysjobhistory h 
            group by job_id) as m on m.job_id = oh.job_id
where oh.step_id = 0
and abs(oh.run_duration - m.avgduration) <  m.stdev_duration
group by oh.job_id

他のヒント

SQL ServerではSTDEVの機能もありますので、多分いくつかの助けになることができる...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top