mysql-每n行具有相同ID的平均值

用户名

我尝试在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 | 
托斯滕·凯特纳(Thorsten Kettner)

您需要模拟分析功能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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MYSQL中每一行的平均值

来自分类Dev

具有条件的行平均值的单个MySQL查询

来自分类Dev

MySQL计算N行的移动平均值

来自分类Dev

对于每一行,计算MySQL中最后20行的平均值

来自分类Dev

MySQL查询平均值

来自分类Dev

MySQL查询平均值

来自分类Dev

MySQL-获取行和行的平均值

来自分类Dev

MySQL查找与ID相匹配的平均值

来自分类Dev

获取显示每年MYSQL平均值的行的列表

来自分类Dev

MySQL从ID选择具有相同值的所有行

来自分类Dev

MySQL选择具有相同ID组的所有行

来自分类Dev

MySQL获取一组中每x分钟的列的平均值和总和

来自分类Dev

如何在SQL,MySQL中每7天查询一次平均值?

来自分类Dev

MySQL多列求和的平均值

来自分类Dev

从加入MYSQL中选择平均值

来自分类Dev

MySQL平均值和总数

来自分类Dev

mysql选择并取平均值

来自分类Dev

日期差之和的平均值。.MySQL

来自分类Dev

使用mysql查找平均值

来自分类Dev

计算mysql结果php的平均值

来自分类Dev

MySQL查询总和并找到平均值

来自分类Dev

MySql表中行的平均值

来自分类Dev

从加入MYSQL中选择平均值

来自分类Dev

mysql选择并取平均值

来自分类Dev

SQL / mySQL-差异平均值

来自分类Dev

MySQL:获取计数和平均值

来自分类Dev

对mysql的时间间隔取平均值

来自分类Dev

如何偏移具有相同ID的特定行-MySQL?

来自分类Dev

在MySQL中串联具有相同ID的行的字段