从按分钟计算的原始数据中按小时汇总 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
我有一个 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