2008-12-09 84 views
1

我們有這樣一組數據,我們需要獲得一列的平均值。一個select avg(x) from y伎倆。但是,我們需要更準確的數字。用sql過濾掉偏離記錄

我認爲必須有一種方法來過濾記錄值過高或過低的值(峯值),以便我們可以在計算平均值時排除它們。

回答

3

有三種類型的平均水平,本來你使用的是什麼是均值 - 所有值的總和除以值的數量。

您可能會發現更多有用的獲得方式 - 最經常存在的價值:

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 
+0

的第一個sql不是一個選項,因爲該列s值是隨機的 第二個很好用! – ken 2008-12-10 05:09:38

1
在SQL Server

也有STDEV函數,所以也許能有所幫助......