MySQL 限制、组和 AVG 查询

标签 mysql

这是给你的谜题:

我将集群计算的统计数据保存在名为“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/

相关文章:

mysql - 使用 SQL 的 GROUP BY 子句时计算单个组中多个不同值的计数

php - 使用 mysql select 查询中的另一个字段添加或减去字段值

MySQL order by 不与 join 一起使用

mysql - 是否可以在安装完 php、mysql 等之后再安装 Sphinx?

php - 首先显示在连接查询中匹配的记录

mysql - MySQL中BLOB字段的字符集转换为UTF-8

mysql - 当定义 ON DELETE RESTRICT 时,是否有任何方法可以使用查询在临时基础上使用 ON DELETE CASCADE 功能?

mysql - SQL:搜索/替换,但仅在值第一次出现在记录中时

asp.net - 将 Sitebuilder SQL Server 数据库导出到 Excel |格式 | MySQL

php - 使用 SQL 和 Codeigniter 返回 4 维数组