1

我们有这组数据,我们需要获得一列的平均值。aselect avg(x) from y可以解决问题。然而,我们需要一个更准确的数字。

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

4

2 回答 2

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
于 2008-12-09T11:57:08.040 回答
1

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

于 2008-12-09T11:07:26.940 回答