Question

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 le tour. Cependant, nous avons besoin d’un chiffre plus précis.

J'ai pensé qu'il devait exister un moyen de filtrer les enregistrements contenant des valeurs trop élevées ou trop basses (pics) pour pouvoir les exclure dans le calcul de la moyenne.

Était-ce utile?

La solution

Il existe trois types de moyenne, et ce que vous utilisez à l’origine est la moyenne - la somme de toutes les valeurs divisée par le nombre de valeurs.

Vous trouverez peut-être plus utile d'obtenir le mode - la valeur la plus fréquente:

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 souhaitez vous débarrasser de toute valeur en dehors de l'écart type d'origine, vous pouvez trouver la moyenne et l'écart type dans une sous-requête, éliminer les valeurs situées en dehors de la plage: moyenne + - écart type, puis effectuez une opération. autre moyenne des valeurs restantes, mais vous commencez à courir le risque d’avoir des valeurs sans signification:

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

Autres conseils

sur le serveur SQL, il y a aussi la fonction STDEV, alors peut-être que ça peut vous aider ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top