我們有這樣一組數據,我們需要獲得一列的平均值。一個select avg(x) from y
伎倆。但是,我們需要更準確的數字。用sql過濾掉偏離記錄
我認爲必須有一種方法來過濾記錄值過高或過低的值(峯值),以便我們可以在計算平均值時排除它們。
我們有這樣一組數據,我們需要獲得一列的平均值。一個select avg(x) from y
伎倆。但是,我們需要更準確的數字。用sql過濾掉偏離記錄
我認爲必須有一種方法來過濾記錄值過高或過低的值(峯值),以便我們可以在計算平均值時排除它們。
有三種類型的平均水平,本來你使用的是什麼是均值 - 所有值的總和除以值的數量。
您可能會發現更多有用的獲得方式 - 最經常存在的價值:
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
也有STDEV函數,所以也許能有所幫助......
的第一個sql不是一個選項,因爲該列s值是隨機的 第二個很好用! – ken 2008-12-10 05:09:38