我有一个由以下列组成的数据库:
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:
答案 0 :(得分:2)
按“每小时”分组,您可以将所有时间分解。 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变量构建它...试试这个...... / p>
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 vars的内部查询使MyHour为0,而CurTime使用now()(日期和时间)。然后对weer_actueel表进行笛卡尔(无连接),限制为24条记录。在构建此HourlyGaps内部查询的结果时,@ Vars一次向后退一小时...... @CurTime从结束开始,然后从自身减去一小时,成为该时间段的开始时间。然后成为下一个小时的结束时间....完成24小时的循环。
然后,仅在24小时的给定匹配时段内的那些时间重新加入统计表。由于我们将“@MyHour”保存为HoursAgo,并且每行都保持增加,因此我们也将其作为正确排序输出的基础。
答案 1 :(得分:0)
很抱歉,无法对此进行测试,但以下内容应该有效:
select hour(tijd) as hour,
avg(wind_s) as avgWindSpeed,
avg(luchtdruk) as avgAirPressure,
avg(temp) as avgTemp
from weer_actueel
where tijd < dateadd(now(), -24)
group by hour
order by hour desc
它giet oan!