我们需要这组数据来获得列的平均值。一个select avg(x) from y
就可以了。但是我们需要一个更准确的数字。
我认为必须有一种过滤具有过高或过低值(峰值)的记录的方法,以便我们可以在计算平均值时排除它们。
答案 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函数,所以也许这可能会有所帮助......