私の最初の反応は、LIMITを使用して平均を5つの結果に制限することでした。そのため、次のように提案しました。
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;
ただし、これにより、平均がホストごとの最新の5つのジョブではなく、最新の5つのジョブに制限されることは明らかです。
ある種のストアドプロシージャを使用せずに、LIMITを使用して平均を制限することは難しいようです。そのため、mysql変数を使用して、各ジョブにホストごとの完了順序または位置を割り当てることを検討しました。
これはテストされていませんが、それが示す理論は良い出発点になるはずです:
まず、ホストに基づいて各ジョブに位置を割り当てる必要があります。
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;
位置を設定したら、集計関数を選択して、結果を上位5つの位置に制限します。
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;
これがあなたのために働くかどうか、または私が考慮していない他の側面があるかどうか私に知らせてください。これは興味深い問題です。