Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Limite, grupo e consulta do AVG do MySQL


Minha reação inicial foi usar LIMIT para restringir a média a 5 resultados, o que me levou a sugerir:
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;

Mas é claro que isso limita a média aos 5 trabalhos mais recentes, e não aos 5 trabalhos mais recentes por host.

Parece difícil usar LIMIT para restringir a média, sem usar algum tipo de procedimento armazenado. Isso me levou a considerar atribuir a cada trabalho uma ordem de conclusão por host, ou posição, usando uma variável mysql.

Isso não foi testado, mas a teoria que ilustra deve ser um bom ponto de partida:

Primeiro, devemos atribuir a cada trabalho uma posição com base em seu host:
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;

Após estabelecer a posição, basta selecionar a função agregada, restringindo os resultados às 5 primeiras posições:
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;

Por favor, deixe-me saber se isso funciona para você, ou se há mais aspectos que eu não considerei. Este é um problema intrigante.