1

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

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

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

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

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

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

一个 ascii 艺术示例:

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

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

一些可能显示我想要完成的伪代码是:

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 上展示更好的图表,该图表显示来自自制气象站的天气数据。

4

1 回答 1

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 天范围(如果需要,您可以轻松地在子选择中限制该范围),并将其与一天的温度值匹配并按日期获取平均组。

于 2013-10-13T11:19:03.283 回答