【问题标题】:Getting temperature difference between intervals获取间隔之间的温差
【发布时间】:2013-10-14 23:21:11
【问题描述】:

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

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

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

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

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

非常感谢

【问题讨论】:

  • 嗯,鉴于现在有 2 个答案可以回答不同的问题,也许需要澄清一下:您是否需要 (a) 与其他答案一样的最高温度 (b) 相对的最大变化到我的回答中的前一个测量值 (c) 只是最大范围 (MAX() - MIN()),(d) 最大的 连续 变化(多条记录,连续的所有负或正偏移)或(e) 有什么不同?
  • 或者像 (f) 给定 whole 数据集,区间 N 的总差异最大,或者 (g) 给定 whole 数据集,哪个区间的 2 个连续记录之间的差异最大?
  • 好的,我会尽力解释,对不起,我不是母语人士。
  • 所以最好的方法,让我们说一个例子:时间 1 - temp 10C Time 2 - temp 12C Time 3 - temp 14C Time 4 - temp 13C Time 5 - temp 16C 现在假设有 1h时间上的差异,而不是我想扫描整个数据库并找到 T 的最大变化可以说是 1 小时,在这种情况下它将是最后一个时间间隔的 3C。所以我希望结果是开始和结束时间+实际变化值

标签: php mysql intervals


【解决方案1】:

实际上并不难。所以我假设它是一个包含timetemp 字段的两列表,其中time 是一个日期时间字段

SELECT MAX(temp) FROM records
WHERE time >= "2013-10-14 12:00:00" and time <= "2013-10-14 15:00:00"

【讨论】:

  • 谢谢,但恐怕你误解了这个问题。我想扫描整个数据库并找到这 3 小时内最大的温度变化(不是实际温度值) - 换句话说,找到整个数据库历史中温度变化最快的时间
【解决方案2】:
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 的最近记录。这可以使用适当的索引,并且有限数量的数据(在旁观者眼中是有限的)非常有效。 然而,如果您需要在大型数据集中进行大量此类查询,那么这是 非规范化 的主要候选者,如果您创建的表还存储计算出的偏移量上一个条目。

【讨论】:

  • 这不是他想要的。他不希望读数之间的温度变化,而是间隔之间的温度变化(这可能由参数提供 - 在他的示例中为 3 小时)。在间隔之间可能有许多读数,因为读数之间的时间从 5 分钟到 10 分钟随机变化。例如,diff 的第一行减去第一个和第 18 个温度,diff 的第二行减去第二个和第 23 个等。
  • 我也是这么想的,实际添加另一列,但问题是这相对容易做到,只需告诉他添加一个 3 小时前的值,然后我会有两个临时工在同一行,但问题是,这首先会增加数据库大小,其次,更重要的是,限制我只使用数据库中列中的时间间隔,如果我想使用让我们说 6h 而不是这将是无用的,这就是为什么我试图避免这种情况并纯粹通过脚本来完成。而且就大小而言,它是一个很大的数据库,目前大约有 20 万行。
  • 没错,我正在寻找整个数据库中特定时间间隔内温度变化最快的速度。
  • 好吧,那么这个答案确实不是它 :) 我稍后会删除它,但是由于您有不规则的间隔,您可能需要详细说明如何处理平局间隔(假设你选择3h,我们只能做3h05的2h55,选哪个?)
  • 在我看来这不是一个问题,我可以使用 datetime_field - 间隔 3 小时
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
相关资源
最近更新 更多