Mysql
 sql >> Base de données >  >> RDS >> Mysql

Limite MySQL, groupe et requête AVG

Ma première réaction a été d'utiliser LIMIT pour restreindre la moyenne à 5 résultats, ce qui m'a amené à suggérer :

select a.host, avg(a.execution_time) from (select id, execution_time, host from jobs order by id desc limit 5) a group by a.host;

Mais force est de constater que cela limite la moyenne aux 5 jobs les plus récents, et non aux 5 jobs les plus récents par host.

Il semble difficile d'utiliser LIMIT pour restreindre la moyenne, sans utiliser une sorte de procédure stockée. Cela m'a amené à envisager d'attribuer à chaque travail un ordre d'exécution par hôte, ou une position, à l'aide d'une variable mysql.

Ceci n'a pas été testé, mais la théorie qu'il illustre devrait être un bon point de départ :

Tout d'abord, nous devons attribuer à chaque tâche une position en fonction de son hôte :

select
  host, 
  execution_time,
  @current_pos := if (@current_host = host, @current_pos, 0) + 1 as position,
  @current_host := host
from
  (select @current_host := null, @current_pos := 0) set_pos,
  jobs
order by
  host,
  id desc;

Après avoir établi la position, sélectionnez simplement la fonction d'agrégation, en limitant les résultats aux 5 premières positions :

select
  jt.host,
  avg(jt.execution_time)
from
  (
  select
    host, 
    execution_time,
    @current_pos := if (@current_host = host, @current_pos, 0) + 1 as position,
    @current_host := host
  from
    (select @current_host := null, @current_pos := 0) set_pos,
    jobs
  order by
    host,
    id desc
  ) jt
where
  jt.position <= 5
group
  by host;

Veuillez me faire savoir si cela fonctionne pour vous, ou s'il y a d'autres aspects que je n'ai pas pris en compte. C'est un problème intrigant.