显示大量数据的平均值

时间:2013-10-13 08:27:38

标签: mysql sql average

我有一个名为WindData的MySQL数据库,如下所示:

  • 时间戳
  • 温度
  • 风速
  • winddirection

我每隔2-3分钟添加一行,所以一年多的时间会有很多行。

现在我想在特定时间范围内(4天前,上个月,过去6个月,2011-2012 ......)将数据显示为图表。假设我想显示过去一年的温度变化情况,使用Google Charts显示它。然后,Google图表具有您可以使用的数据点数量的最大限制。

然后我想要一个SQL查询,我在其中指定了给我的时间范围(2012-01-01 - 2013-10-10)

  • 固定行数(例如200)
  • 每一行都包含该时间间隔内的平均值和最大值。

ascii艺术示例:

...............1..............2...............+..............199..............200

.在我的表格中是一行,而数字代表前一个点的平均值和最大值。

可能显示我想要完成的一些psudocode是:

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-01-01 AND timestamp < 2013-10-10

这只会给我一个结果,我得到整个时间范围的平均值。 所以也许有一种方法可以再创建一个SQL语句,它使用不同的时间范围运行上述sql语句200次。

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-01-01 AND timestamp < 2013-02-1

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-02-01 AND timestamp < 2013-03-1 

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-03-01 AND timestamp < 2013-04-1

SELECT AVG(temperature) 
FROM WindData 
WHERE timestamp > 2012-04-01 AND timestamp < 2013-05-1

......等等。

如果有人有兴趣,我会在这里使用帮助在www.surfvind.se上展示更好的图表,该图表显示了自制气象站的天气数据。

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容获取固定数量的行: -

SELECT units.i + tens.i * 10 + hundreds.i AS aNumber
FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 ) hundreds

您可以使用类似的内容来获取不同的范围,并将其与您的数据连接以获得每个范围内的值数。

编辑 - 要使用您添加的详细信息: -

SELECT Sub1.aDate, AVG(temperature)
FROM 
(
    SELECT DATE_ADD('2012-01-01', INTERVAL units.i + tens.i * 10 + hundreds.i * 100 DAY) AS aDate
    FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
    CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
    CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) hundreds
) Sub1
LEFT OUTER JOIN
WindData
ON Sub1.aDate = DATE(WindData.`timestamp`)
GROUP BY Sub1.aDate

这是从2012-01-01开始获得1000天的范围(如果需要,您可以轻松地在子选择中限制该范围),并将其与一天的临时值匹配并按日期获得平均组