我的温度值表每小时更新一次。
ID Temp Hyg Time
...
3203 13 62.7 2015-05-01 09:16:19
3204 12.93 62.9 2015-05-01 10:16:19
3205 13.12 64.9 2015-05-01 11:16:20
3206 13.5 65.7 2015-05-01 12:16:20
3207 13.75 65.8 2015-05-01 13:16:20
3208 13.93 65.6 2015-05-01 14:16:21
3209 14.06 65.7 2015-05-01 15:16:21
...
直到现在我在图表中显示数据,显示过去50小时(=记录)。
SELECT * FROM (SELECT * FROM `tblEnvironment` ORDER BY id DESC LIMIT 50) sub ORDER BY id ASC
但现在我需要显示更大的时间范围而不超过50个显示点。
我如何合并,例如3记录到1的平均温度为3?
答案 0 :(得分:2)
此解决方案适用于您的ID列可能存在间隙的情况。因此,我们创建一个rownumber列,因此我们可以决定它,如果它是每隔三行。
select
t.*
, @rownumber := @rownumber + 1
, @groupnumber := if(@rownumber % 3 = 0, @groupnumber + 1, @groupnumber) as groupnumber
from
t
, (select @rownumber := -1, @groupnumber := 0) v
order by id desc
limit 150
然后我们可以分组这个子查询:
select group_concat(ID), avg(Temp), avg(Hyg), min(Time), max(Time), groupnumber from (
select
t.*
, @rownumber := @rownumber + 1
, @groupnumber := if(@rownumber % 3 = 0, @groupnumber + 1, @groupnumber) as groupnumber
from
t
, (select @rownumber := -1, @groupnumber := 0) v
order by id desc
limit 150
) sq
group by groupnumber
随着groupnumber每增加第三行,你最终会获得50行。
答案 1 :(得分:0)
您想要使用GROUP BY: https://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html
您可以直接对列进行分组(例如时间),也可以对该列的功能进行分组,例如:您可以在DATE_FORMAT或TIME()上进行分组,以便在一段时间内进行分组,例如:按小时计算。