mysql-使用相同id平均每n行的值

mysql-使用相同id平均每n行的值,mysql,sql,average,Mysql,Sql,Average,我尝试用Perl脚本做一些事情,但我想知道是否有一种更简单、更快的方法可以直接通过SQL来完成 首先,这里是我从中获取值的表的摘录(time列是一个时间戳): 现在,我在这个表中有大约500或600K行。我用它来创建图表。我只需从Perl脚本中检索值,然后生成一个图形,但无论如何。问题是这些措施每5分钟采取一次。所以,如果我创建一整天的图表,每台计算机将有288个“点”((60/5)*24) 我的问题是,如果我希望我的图表有更大的粒度,比如说只有96个点(每15分钟测量一次),我该怎么做 在这种

我尝试用Perl脚本做一些事情,但我想知道是否有一种更简单、更快的方法可以直接通过SQL来完成

首先,这里是我从中获取值的表的摘录(time列是一个时间戳):

现在,我在这个表中有大约500或600K行。我用它来创建图表。我只需从Perl脚本中检索值,然后生成一个图形,但无论如何。问题是这些措施每5分钟采取一次。所以,如果我创建一整天的图表,每台计算机将有288个“点”((60/5)*24)

我的问题是,如果我希望我的图表有更大的粒度,比如说只有96个点(每15分钟测量一次),我该怎么做

在这种情况下,我必须找到一种方法来告诉“对于每个相同的ID(本例中的计算机),取您为它找到的最后3个值(我按日期排序,所以应该没有问题),将它们取平均值,然后给我结果”

问题是我不知道怎么做,而且时间列也可能是个问题。他会怎么做?有没有可能精确到“在平均了最后3个CPU值之后,让最后一行的时间填充新的平均行”?或者事实上我也可以平均时间,这仍然有效

提前感谢大家:)

编辑:

有些人想要一个我想要的输出示例,这里是: (在本例中,我们假设我只有2台计算机,每台计算机有6个值)

如果有正常的要求,我会有这个

mysql> SELECT Computer, TIME, CPU FROM myTable order by date;

|  Computer  |    TIME    |   CPU   |
| Computer-1 | 1418115601 |      10 | 
| Computer-2 | 1418115601 |      30 | 
| Computer-1 | 1418115701 |      15 | 
| Computer-2 | 1418115701 |      40 | 
| Computer-1 | 1418115801 |      15 | 
| Computer-2 | 1418115801 |      50 | 
| Computer-1 | 1418115901 |      12 | 
| Computer-2 | 1418115901 |      50 | 
| Computer-1 | 1418116101 |      10 | 
| Computer-2 | 1418116101 |      40 | 
| Computer-1 | 1418116201 |      11 | 
| Computer-2 | 1418116201 |      35 | 
我想要相同ID(计算机)的最后3个值的平均值,因此:


您需要模拟分析函数ROW_NUMBER()OVER(PARTITION BY),该函数在MySQL中不可用。您可以在MySQL中使用变量

我们为每台计算机的行编号为0、1、2、3、4、5、6等。然后我们除以3得到0、0、0、1、1、1、2等。因此,我们得到了一个分组标准,以进行聚合:

select computer, max(time), avg(cpu)
from
(
  select 
    @row_number := case when @computer = computer then @row_number + 1 else 0 end as row_number,
    @computer := computer as computer,
    time, 
    cpu
  from mytable
  cross join (select @row_number := -1, @computer := '') as t
  order by computer, time
) as t
group by computer, row_number div 3
order by computer, row_number div 3;

我在Pinal Dave的博客中找到了行号技巧:

你能编辑你的问题并提供你想要的结果吗?嗯。。。我设想添加一个用户定义的变量,每个不同的时间间隔递增一个。然后使用它和mod运算符,如果余数为1,则返回这些行。。。这实际上会返回第一组时间,第四组、第七组、第十组等等。。。这就是你想要的吗?从我的表格中按楼层分组选择楼层(时间/900)*900,平均值(东西)(时间/900)*900)是
CPU
decimal points还是value delimiter中的逗号?逗号是十进制的,我是欧洲人,我们使用逗号,但我会使用一个点,你是对的,它会更清晰哇,我很确定它确实有效!!我正在详细地签入,因为我在现实中有更多的值,但到目前为止还不错:D我明天会回来检查答案是否有效!(唯一遗漏的是最后一个字母后面的“as t”)”。否则你会出错。我很高兴这对你有用。感谢您提示派生表需要别名。我大部分时间使用Oracle,不需要它(我认为这是对SQL标准的方便扩展)。我会更新我的答案。
|  Computer  |    TIME    |   CPU   |
| Computer-1 | 1418115801 |   13.33 | 
| Computer-2 | 1418115801 |      40 |
| Computer-1 | 1418116201 |      11 | 
| Computer-2 | 1418116201 |   41.66 | 
select computer, max(time), avg(cpu)
from
(
  select 
    @row_number := case when @computer = computer then @row_number + 1 else 0 end as row_number,
    @computer := computer as computer,
    time, 
    cpu
  from mytable
  cross join (select @row_number := -1, @computer := '') as t
  order by computer, time
) as t
group by computer, row_number div 3
order by computer, row_number div 3;