質問
私たちは、列の平均値を取得する必要があり、このデータのセットを持っています。 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の機能もありますので、多分いくつかの助けになることができる...
所属していません StackOverflow