2008-12-09 13 views
1

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

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 
+0

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

1

dans le serveur sql il y a aussi la fonction ECARTYPE alors peut-être que peut être un peu d'aide ...