Nous avons cet ensemble de données dont nous avons besoin pour obtenir la moyenne d'une colonne. un select avg(x) from y
fait l'affaire. Cependant, nous avons besoin d'un chiffre plus précis. J'ai pensé qu'il doit y avoir un moyen de filtrer les enregistrements qui ont des valeurs trop élevées ou trop faibles (pics) afin que nous puissions les exclure dans le calcul de la moyenne.filtrer l'enregistrement déviant avec sql
1
A
Répondre
3
Il existe trois types de moyenne, et ce que vous utilisez à l'origine est la moyenne - la somme de toutes les valeurs divisé par le nombre de valeurs.
Vous trouverez peut-être plus utile pour obtenir le mode - la valeur se produisant le plus souvent:
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
Si vous ne voulez vous débarrasser de toutes les valeurs en dehors de l'écart-type original, vous pouvez trouver la moyenne et l'écart-type dans une sous-requête, éliminer les valeurs qui sont en dehors de la plage: moyenne + - écart-type, puis faire une moyenne supplémentaire des valeurs restantes, mais vous commencez à courir le risque d'avoir des valeurs vides de sens:
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
dans le serveur sql il y a aussi la fonction ECARTYPE alors peut-être que peut être un peu d'aide ...
la premier sql n'est pas une option parce que la colonne s la valeur est aléatoire la seconde fonctionne très bien! – ken