sql >> Base de Datos >  >> RDS >> Mysql

MySQL Límite, Grupo y Consulta AVG

Mi reacción inicial fue usar LIMIT para restringir el promedio a 5 resultados, lo que me llevó 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;

Pero está claro que esto limita el promedio a los 5 trabajos más recientes y no a los 5 trabajos más recientes por host.

Parece difícil usar LIMIT para restringir el promedio, sin usar algún tipo de procedimiento almacenado. Esto me llevó a considerar la posibilidad de asignar a cada trabajo una orden de finalización o posición por host mediante una variable mysql.

Esto no se ha probado, pero la teoría que ilustra debería ser un buen punto de partida:

Primero, debemos asignar a cada trabajo una posición basada en su anfitrión:

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;

Después de establecer la posición, simplemente seleccione la función agregada, restringiendo los resultados a las 5 primeras posiciones:

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;

Avíseme si esto funciona para usted o si hay más aspectos que no he considerado. Este es un problema intrigante.