Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL Limit, Gruppe und AVG-Abfrage

Meine erste Reaktion war, LIMIT zu verwenden, um den Durchschnitt auf 5 Ergebnisse zu beschränken, was mich zu folgendem Vorschlag veranlasste:

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;

Aber es ist klar, dass dies den Durchschnitt auf die letzten 5 Jobs beschränkt und nicht auf die letzten 5 Jobs pro Host.

Es scheint schwierig zu sein, LIMIT zu verwenden, um den Durchschnitt einzuschränken, ohne irgendeine Art von gespeicherter Prozedur zu verwenden. Dies veranlasste mich, darüber nachzudenken, jedem Job mithilfe einer mysql-Variablen eine Abschlussreihenfolge oder Position pro Host zuzuweisen.

Dies ist ungetestet, aber die Theorie, die es veranschaulicht, sollte ein guter Ausgangspunkt sein:

Zuerst sollten wir jedem Job basierend auf seinem Host eine Position zuweisen:

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;

Nachdem Sie die Position festgelegt haben, wählen Sie einfach die Aggregatfunktion aus und beschränken Sie die Ergebnisse auf die Top-5-Positionen:

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;

Bitte lassen Sie mich wissen, ob dies für Sie funktioniert oder ob es weitere Aspekte gibt, die ich nicht berücksichtigt habe. Dies ist ein faszinierendes Problem.