2012-11-19 111 views
2

我需要根据时间戳和字段1来计算行的平均值。例如,我有如何计算MySQL中的计算平均值?

Field1  Field2  TImeStamp 
    X   X1 11/19/2012 12:21:32 
    X   X2 11/19/2012 12:22:32 
    X   X3 11/19/2012 12:24:32 
    Y   Y1 11/19/2012 12:21:32 
    Y   Y2 11/19/2012 12:22:32 
    Y   Y3 11/19/2012 12:23:32 
    Y   Y4 11/19/2012 12:24:32 

表我有这种表的时间戳插入与其他领域沿着当前时间。现在我想根据时间戳来计算平均值。例如,我想在特定的持续时间内平均获得另一个的最新+平均值。另外,在上述情况下,我想有:

Fields Averaged function 
    X  (X3+(X1+X2)/2)/2 
    Y  (Y4+(Y1+Y2+Y3)/3)/2 

对于上面我必须计算的(现在的平均+(现在-1分钟,以现在-5分钟))的平均值。我怎样才能做到这一点?

回答

1

我想这会做到这一点:

select field1, if(avgf2 = 0,maxf2,(maxf2+avgf2)/2) avgfun 
from (select m.field1 field1, 
      max(if(timestamp = maxts, field2, null)) maxf2, 
      coalesce(avg(if(timestamp = maxts, null, field2)),0) avgf2 
     from mytable m 
     join (select field1, max(timestamp) maxts 
      from mytable 
      where timestamp between date_sub(now(), interval 5 minute) and now() 
      group by field1) mm 
     using (field1) 
     where timestamp between date_sub(now(), interval 5 minute) and now() 
     group by field1) x 

的关键是,像MAX和AVG聚合函数忽略空。

要仅检查特定时间范围,请将WHERE timestamp BETWEEN <begin> AND <end>插入到两个子查询中。

+0

感谢您为我发布解决方案Mr. Barmar。但我无法做到这一点。代码中是否有语法错误?我刚刚替换了您提供的脚本中的变量。我也没有处理问题中提到的处理时间的情况。如果可能的话,你可以给我解释一下吗? – ChanChow

+0

修复了一堆语法错误,现在就试试吧。 – Barmar

+0

第8行的mm是什么。它是拼写错误吗?我正试图理解你现在的代码 – ChanChow