отфильтровать отклоняющуюся запись с помощью sql
-
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, так что, возможно, это может помочь...