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.