Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL Limit, Group e AVG Query

La mia reazione iniziale è stata quella di utilizzare LIMIT per limitare la media a 5 risultati, il che mi ha portato a suggerire:

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;

Ma è chiaro che ciò limita la media ai 5 lavori più recenti e non ai 5 lavori più recenti per host.

Sembra difficile utilizzare LIMIT per limitare la media, senza utilizzare una sorta di stored procedure. Questo mi ha portato a considerare di assegnare a ciascun lavoro un ordine di completamento per host, o posizione, utilizzando una variabile mysql.

Questo non è testato, ma la teoria illustrata dovrebbe essere un buon punto di partenza:

Innanzitutto, dovremmo assegnare a ogni lavoro una posizione in base al suo 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;

Dopo aver stabilito la posizione, basta selezionare la funzione di aggregazione, limitando i risultati alle prime 5 posizioni:

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;

Per favore fatemi sapere se questo funziona per voi, o se ci sono più aspetti che non ho considerato. Questo è un problema intrigante.