отфильтровать отклоняющуюся запись с помощью sql

StackOverflow https://stackoverflow.com/questions/352389

  •  20-08-2019
  •  | 
  •  

Вопрос

У нас есть набор данных, которые нам нужны, чтобы получить среднее значение столбца.а select 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 также есть функция STDEV, так что, возможно, это может помочь...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top