用sql过滤掉偏差记录

时间:2008-12-09 11:00:41

标签: sql statistics deviation

我们需要这组数据来获得列的平均值。一个select avg(x) from y就可以了。但是我们需要一个更准确的数字。

我认为必须有一种过滤具有过高或过低值(峰值)的记录的方法,以便我们可以在计算平均值时排除它们。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

在sql server中还有STDEV函数,所以也许这可能会有所帮助......