mysql - 显示大量数据的平均值

标签 mysql sql average

我有一个名为 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 上展示更好的图表,它显示来自自制气象站的天气数据。

最佳答案

你可以使用这样的方法获得固定数量的行:-

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

关于mysql - 显示大量数据的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19343228/

相关文章:

mysql - MySQL中防止条件删除的触发器

sql - SQL中,去除相邻的重复行并进行时间计算

php - Wordpress 本地主机安装错误 - 您的 PHP 安装似乎缺少 WordPress 所需的 MySQL 扩展

sql - 在postgresql中的两个用户之间的对话中获取最新消息

mysql - MySQL 快照与 SQL 转储的优缺点

Excel:使用 LOOKUP 或 SUMPRODUCT 代替 AverageIFS

arrays - 从哈希数组计算平均时间

mysql - 从 SQL 中的每一行的 2 列计算 AVERAGE

php - 使用良好的 SQL 查询而不是 PHP 代码

php - 从php获取数据到ajax