mysql-使用相同id平均每n行的值
我尝试用Perl脚本做一些事情,但我想知道是否有一种更简单、更快的方法可以直接通过SQL来完成 首先,这里是我从中获取值的表的摘录(time列是一个时间戳): 现在,我在这个表中有大约500或600K行。我用它来创建图表。我只需从Perl脚本中检索值,然后生成一个图形,但无论如何。问题是这些措施每5分钟采取一次。所以,如果我创建一整天的图表,每台计算机将有288个“点”((60/5)*24) 我的问题是,如果我希望我的图表有更大的粒度,比如说只有96个点(每15分钟测量一次),我该怎么做 在这种情况下,我必须找到一种方法来告诉“对于每个相同的ID(本例中的计算机),取您为它找到的最后3个值(我按日期排序,所以应该没有问题),将它们取平均值,然后给我结果” 问题是我不知道怎么做,而且时间列也可能是个问题。他会怎么做?有没有可能精确到“在平均了最后3个CPU值之后,让最后一行的时间填充新的平均行”?或者事实上我也可以平均时间,这仍然有效 提前感谢大家:) 编辑: 有些人想要一个我想要的输出示例,这里是: (在本例中,我们假设我只有2台计算机,每台计算机有6个值) 如果有正常的要求,我会有这个mysql-使用相同id平均每n行的值,mysql,sql,average,Mysql,Sql,Average,我尝试用Perl脚本做一些事情,但我想知道是否有一种更简单、更快的方法可以直接通过SQL来完成 首先,这里是我从中获取值的表的摘录(time列是一个时间戳): 现在,我在这个表中有大约500或600K行。我用它来创建图表。我只需从Perl脚本中检索值,然后生成一个图形,但无论如何。问题是这些措施每5分钟采取一次。所以,如果我创建一整天的图表,每台计算机将有288个“点”((60/5)*24) 我的问题是,如果我希望我的图表有更大的粒度,比如说只有96个点(每15分钟测量一次),我该怎么做 在这种
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;