从按分钟计算的原始数据中按小时汇总 MySQL 数据

Aggregating MySQL data on hourly basis from minute-wise raw data

我有一个 table、table_1,它有每分钟的数据,看起来像:

+---------------------+---------+
| date_time           | value   |
+---------------------+---------+
| 2015-06-05 18:00:00 | 222.663 |
| 2015-06-05 18:01:00 | 222.749 |
| 2015-06-05 18:02:00 | 222.957 |
| 2015-06-05 18:03:00 | 223.063 |
| 2015-06-05 18:04:00 | 223.117 |
+---------------------+---------+

我想获取每小时的最小值和最大值。类似于:

+---------------------+---------+
| date_time           | value   |
+---------------------+---------+
| 2015-06-05 18:10:00 | 200.663 |
| 2015-06-05 18:45:00 | 222.749 |
| 2015-06-05 19:10:00 | 190.957 |
| 2015-06-05 19:33:00 | 400.063 |
+---------------------+---------+

目前我正在 PHP 中创建一个 for 循环并运行每个小时的查询。然而,这显然不是最好的方法,因此非常耗时。例如:

for($temp = $st; $temp <= $et; $temp = $temp + 60){//looping for each hour

 $sql1 = "select * from table_1 where value in 
 (select max(value) from table_1 
 where date_time >= '".date('Y-m-d H:i:s',$st)."' 
 and date_time < '".date('Y-m-d H:i:s',$temp)."' ) 
 and date_time >= '".date('Y-m-d H:i:s',$st)."' 
 and date_time < '".date('Y-m-d H:i:s',$temp)."' limit 1";

 $rs1 = mysql_query($sql1);

 $row1 = mysql_fetch_assoc($rs1)
 $val1 = $row1['value']; 
 $date1 = $row1['date_time'];

} 

答题

select DATE_FORMAT(date_time,'%Y-%m-%d %H:00:00') h, min(value), max(value)
    from thetable 
  group by h

1.如何每隔 6 小时或 15 分钟做同样的事情。

15 分钟间隔:

select date_time, min(value), max(value) 
     from t1 
  group by round(unix_timestamp(date_time)/(15 * 60))

6 小时间隔更改为 (6 * 60 * 60)

2。上面的结果不显示对应于最小值和最大值的原始时间戳。如何获得这些。

这样的查询给你你想要的。但是,例如,如果一个区间中有一些最小值,那么得到这么多行有多少这样的值

select date_time, value 
    from t1, 
         (select DATE_FORMAT(date_time,'%Y-%m-%d %H:00:00') h, 
                 min(value) min, max(value) max 
              from t1 
            group by h
         ) t 
  where value in (min, max) 
    and DATE_FORMAT(date_time,'%Y-%m-%d %H:00:00') = h