这是给你的谜题:
我将集群计算的统计数据保存在名为“jobs”的 MySQL 表中。每个作业行都有一个执行作业的主机(不是唯一的)、一个以秒为单位的作业执行时间和一个唯一的整数作为 PK,因此我可以简单地通过订购 PK 来订购完成的作业。
截至目前,使用 average 和 group by,我可以找到每个主机在所有已完成作业中的平均执行时间(以秒为单位)。我想要的不是平均每台主机的所有执行时间,而是每台主机最后五个作业的平均时间。
有各种各样的操作和分组依据的例子,还有很多限制操作的例子,但是有没有办法在一个相当简单的 MySQL 查询中将两者结合起来?
编辑:如果我不清楚,我想要主机 1 的平均五次执行时间,主机 2 的平均五次执行时间,等等。
最佳答案
我最初的 react 是使用 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;
请让我知道这是否适合您,或者是否有更多方面我没有考虑。这是一个有趣的问题。
关于MySQL 限制、组和 AVG 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3332102/