计算平均值

时间:2012-02-08 13:51:53

标签: php mysql

我有一个由以下列组成的数据库:

time | windSpeed | temperature | more parameters

每30秒自动添加一行当前风速,温度等。

为了能够显示图形,我想构建一个MySQL查询,它显示从最新条目开始的24小时每小时平均值。 所以新的关系/表应如下所示:

hour | avgWindspeed | avgTemperature
-1   | 13.3         | -5.8
-2   | 16.4         | -3.1

这是我得到了多远: 每行应该由60分钟/ 30秒= 120行组成。

SELECT * 
         FROM (
                   SELECT @row := @row +1 AS rownum, tijd, wind_s, luchtdruk, temp
                   FROM (
                         SELECT @row :=0
                         )r, weer_actueel
                   ORDER BY tijd DESC
         )ranked
         WHERE rownum %120 =1

现在显示第120行,而不是显示120行的平均值。

有人可以帮助我吗?

编辑1:

  • 我使用的编程语言是PHP;但我会喜欢原生的MySQL解决方案。
  • 列'time'是一个mysql日期时间值

2 个答案:

答案 0 :(得分:2)

按“每小时”分组,您可以将所有时间分解。 WHERE子句总是在24小时内明确地显示当前日期/时间,因此这甚至会占到下午14:37到14:37之前一天的时间。 然后,通过使用min(w.time),我们得到订单的第一个实际完整日期/时间戳,因此我们可以按最后时间在顶部向后排序,如果是正确的顺序时间是早上7点,你要回到前一天的第23小时,直到第8小时。这可以确保适当的时间。

select
      hour( w.time ) as PerHour,
      avg( w.WindSpeed ) as AvgWind,
      avg( w.Temperature ) as AvgTemp,
      min( w.time ) as StartingTimeForGroup
   from
      weer_actueel w
   where
      w.time >= date_sub( curdate(), interval 24 hour )
   group by
      PerHour
   order by
      StartingTimeForGroup  DESC

如果你希望破坏完全基于一小时内的分钟......例如

13:48 - 12:49
12:48 - 11:49
11:48 - 10:48

通过预先查询检测到将导致24小时的大型案例构造的起点将需要更多的技巧,但我们甚至可以用@sql变量构建它...试试这个...... / p>

select
      HourlyGaps.HoursAgo,
      avg( w.WindSpeed ) as AvgWind,
      avg( w.Temperature ) as AvgTemp
   from
      ( select
              @MyHour := @MyHour +1 as HoursAgo,
              @CurTime as EndTime,
              @CurTime := date_sub( @CurTime, interval 1 hour ) as StartTime
           from
              ( select @MyHour := 0,
                       @CurTime := now()) SqlVars,
              weer_actueeel w2
           limit 24 ) HourlyGaps
       JOIN weer_actueel w
          on w.time > HourlyGaps.StartTime 
          and w.time <= HourlyGaps.EndTime
   group by
      HoursAgo
   order by
      HoursAgo

使用sql vars的内部查询使MyHour为0,而CurTime使用now()(日期和时间)。然后对weer_actueel表进行笛卡尔(无连接),限制为24条记录。在构建此HourlyGaps内部查询的结果时,@ Vars一次向后退一小时...... @CurTime从结束开始,然后从自身减去一小时,成为该时间段的开始时间。然后成为下一个小时的结束时间....完成24小时的循环。

然后,仅在24小时的给定匹配时段内的那些时间重新加入统计表。由于我们将“@MyHour”保存为HoursAgo,并且每行都保持增加,因此我们也将其作为正确排序输出的基础。

答案 1 :(得分:0)

很抱歉,无法对此进行测试,但以下内容应该有效:

select hour(tijd) as hour, 
       avg(wind_s) as avgWindSpeed, 
       avg(luchtdruk) as avgAirPressure, 
       avg(temp) as avgTemp
from   weer_actueel
where  tijd        <    dateadd(now(), -24)
group  by hour
order  by hour desc

它giet oan!