0

我的问题比实际更“理论”——换句话说,我并不是真的在寻找如何做某事的特定代码,而更像是关于如何做的建议。我已经考虑了一段时间,但无法提出一些可行的解决方案。所以基本上,我有一个 MySQL 数据库,可以保存来自我的气象站的天气信息。

第一列包含测量的日期和时间(日期时间格式字段),然后是各种列,如温度、湿度等。我现在感兴趣的是温度。数据按日期和时间升序排序,这意味着最新的值始终插入到末尾。

现在,我想要做的是使用 PHP 脚本,连接到数据库并找到一定间隔内的温度变化,然后找到最大值。换句话说,例如,假设我选择间隔 3h。然后我想从所有值中找出在这 3 小时(或 5 小时、1 天等)中温度变化最显着的时间。

问题是我真的不知道该怎么做。如果我只是从数据库中获取值,我会一个一个地获取值,但我想不出一种方法来获取一个值,比如从过去的电流中获取 3h。然后很容易,只需减去它们并从当时的日期时间字段中获取日期,但是如何获取例如相隔 3 小时的值(另外,问题是它不能只是一个特定的数字过去的行数,因为数据保存的间隔不规则,范围在 5-10 分钟之间,因此过去 3 小时可能是不同的行数)。

任何想法如何做到这一点?

多谢

4

2 回答 2

0

其实也不是特别难。time所以我会假设它是一个带有和字段的两列表temp,其中time是一个 DATETIME 字段

SELECT MAX(temp) FROM records
WHERE time >= "2013-10-14 12:00:00" and time <= "2013-10-14 15:00:00"
于 2013-10-14T23:39:47.000 回答
0
SELECT t1.*, ABS(t1.temperature - t2.temperature) as change
FROM  tablename t1
JOIN tablename t2
    ON  t2.timecolumn <= (t1.timecolumn - INTERVAL 3 HOUR)
LEFT JOIN tablename t3
    ON  t3.timecolumn <= (t1.timecolumn - INTERVAL 3 HOUR)
    AND t2.timecolumn > t3.timecolumn
WHERE 
  t3.some_non_nullable_column IS NULL
ORDER BY ABS(t1.temperature - t2.temperature) DESC
LIMIT 1;

1 个表自身连接了 2 次,t2 是 t1 的被隔离的直接前任t2 是偏移量 3h 之前或更多的最近记录。这可以通过适当的索引和有限数量的数据(在旁观者的眼中有限)非常有效。但是,如果您需要在大型数据集中进行大量此类查询,那么这是非规范化的主要候选者,如果您创建一个表,该表还存储与前一个条目相比计算出的偏移量。

于 2013-10-14T23:40:08.163 回答