按时间分组平均温度

时间:2015-05-04 13:20:56

标签: mysql time group-by average

我的温度值表每小时更新一次。

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?

2 个答案:

答案 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()上进行分组,以便在一段时间内进行分组,例如:按小时计算。