php - 计算平均值

标签 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 解决方案。
  • “时间”列是一个 mysql 日期时间值

最佳答案

通过按“每小时”分组,您可以分割所有小时数。 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 变量构建它......试试这个..

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 变量的内部查询将 MyHour 设置为 0,将 CurTime 设置为 now()(日期和时间)。然后对限制为 24 条记录的 weer_actueel 表执行笛卡尔(无连接)。在构建这个 HourlyGaps 内部查询的结果时,@Vars 一次向后一小时......@CurTime 从结束开始,然后从自身减去一小时成为该时间段的开始小时。 . 然后成为下一个小时的结束时间.... 以 24 小时为周期完成。

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

关于php - 计算平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9194618/

相关文章:

javascript - 通过 select-option 更新图像的 src

mysql - 有很多页面的类别(巨大的偏移量)(stackoverflow 是如何工作的?)

MySQL多表加入空值

mysql - 如何将文件 .mdf 和 .ldf 转换为 mysql 格式

php - 如何在 PHP 中从字符串数组创建对象

nginx - php-fpm 进程监控/分析

php - 如何在symfony中调用redirectToRoute方法接受 Controller

php - imagerotate 改变原始图像的颜色

MySQL::什么时候应该将 SQL 函数(条件、格式化)移至中间件层?

mysql - 在 SQL 中从不同的表中选择字段而不需要匹配字段