отфильтровать отклоняющуюся запись с помощью sql - PullRequest
1 голос
/ 09 декабря 2008

У нас есть этот набор данных, который нам нужен, чтобы получить среднее значение столбца. select avg(x) from y делает свое дело. Однако нам нужна более точная цифра.

Я подумал, что должен быть способ фильтрации записей, которые имеют либо слишком высокие, либо слишком низкие значения (пики), чтобы мы могли исключить их при расчете среднего.

Ответы [ 2 ]

3 голосов
/ 09 декабря 2008

Существует три типа среднего, и то, что вы изначально используете, является средним значением - суммой всех значений, деленной на количество значений.

Возможно, вам будет удобнее получить режим - наиболее часто встречающееся значение:

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 голос
/ 09 декабря 2008

на сервере sql есть также функция STDEV, так что, может быть, это поможет ...

...