我尝试在Perl脚本中执行某些操作,但是我想知道是否存在一种更简单,更快捷的方法,可以直接通过SQL进行操作。
首先,这是我从中获取值的表的一部分(时间列为时间戳):
| Computer | TIME | CPU |
| Computer-1 | 1418115601 | 67 |
| Computer-2 | 1418115601 | 31 |
| Computer-1 | 1418115601 | 39 |
| Computer-2 | 1418115601 | 39 |
| Computer-1 | 1418115601 | 37 |
| Computer-2 | 1418115601 | 38 |
| Computer-1 | 1418115601 | 54 |
| Computer-2 | 1418115601 | 0 |
| Computer-1 | 1418115601 | 52 |
| Computer-2 | 1418116501 | 28 |
| Computer-1 | 1418116501 | 30 |
| Computer-3 | 1418116501 | 33 |
| Computer-1 | 1418116501 | 23 |
| Computer-2 | 1418116501 | 5 |
| Computer-2 | 1418116301 | 5 |
现在,我在此表中有500或600K行。我用它来创建图形。我只是从Perl脚本中检索值,然后生成图形,但无论如何。问题是这些措施每5分钟采取一次。因此,如果我创建一整天的图表,则每台计算机将有288个“点”((60/5)* 24)。
我的问题是,如果我想为图表提供更大的粒度,比如说仅96个点(每15分钟测量一个点),我该怎么做?
在这种情况下,我将不得不找到一种方法来告诉“对于每个相同的ID(在这种情况下为计算机),采用您为其找到的最后3个值(我按日期排序,因此应该没有问题),将它们取平均值,然后给我结果”。
问题是我不知道该怎么做,此外,TIME列也可能是一个问题。他将如何处理?是否可以精确地修正“在对CPU的最后3个值求平均后,让最后一行的TIME填充新的求平均行”?或者实际上我也可以平均时间,并且仍然可以工作...
谢谢大家:)
编辑 :
有人想要一个输出示例,我想在这里是这样的:(在这个示例中,我们假设我只有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个值的平均值,所以:
| Computer | TIME | CPU |
| Computer-1 | 1418115801 | 13.33 |
| Computer-2 | 1418115801 | 40 |
| Computer-1 | 1418116201 | 11 |
| Computer-2 | 1418116201 | 41.66 |
您需要模拟分析功能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的博客中找到了row_number技术:http : //blog.sqlauthority.com/2014/03/09/mysql-reset-row-number-for-each-group-partition-by-row-number/
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句