我们有这组数据,我们需要获得一列的平均值。aselect avg(x) from y
可以解决问题。然而,我们需要一个更准确的数字。
我认为必须有一种方法可以过滤具有太高或太低值(尖峰)的记录,以便我们可以在计算平均值时将它们排除在外。
我们有这组数据,我们需要获得一列的平均值。aselect avg(x) from y
可以解决问题。然而,我们需要一个更准确的数字。
我认为必须有一种方法可以过滤具有太高或太低值(尖峰)的记录,以便我们可以在计算平均值时将它们排除在外。
平均值分为三种类型,您最初使用的是平均值 - 所有值的总和除以值的数量。
您可能会发现获取模式更有用 - 最常出现的值:
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 函数,所以也许这会有所帮助......