Php MySQL:忽略行间差异大于x的结果

Php MySQL:忽略行间差异大于x的结果,php,mysql,sql,Php,Mysql,Sql,我有一个简单的PHP/HTML页面,它运行MySQL查询来提取温度数据并显示在图形上。每隔一段时间就会有一些坏数据从我的传感器DHT11温度/相对湿度传感器读取,由Arduino读取,其中会有一个过高或过低的峰值,因此我知道这不是一个好的数据点。我发现这很容易处理,如果它超出了范围,比如在非正常温度下,我只使用一个BETWEEN语句过滤掉任何不可能为真的记录 我确实意识到这最终应该在源代码处修复,这样这些错误读数就不会在第一时间发布,但是作为一个调试工具,我确实希望在我的数据库中记录这些错误,这

我有一个简单的PHP/HTML页面,它运行MySQL查询来提取温度数据并显示在图形上。每隔一段时间就会有一些坏数据从我的传感器DHT11温度/相对湿度传感器读取,由Arduino读取,其中会有一个过高或过低的峰值,因此我知道这不是一个好的数据点。我发现这很容易处理,如果它超出了范围,比如在非正常温度下,我只使用一个BETWEEN语句过滤掉任何不可能为真的记录

我确实意识到这最终应该在源代码处修复,这样这些错误读数就不会在第一时间发布,但是作为一个调试工具,我确实希望在我的数据库中记录这些错误,这样我就可以跟踪硬件出错的时间点

然而,这对偶尔出现的峰值没有帮助,这些峰值实际上落在正常温度范围内。例如,如果外面是65华氏度,传感器偶尔会抛出一个奇怪的读数,我得到一个107华氏度的读数,它完全搞乱了我的图表、缩放等。我不能用我知道的中间值来过滤,因为107华氏度实际上是我所在地区夏季的实际温度

有没有办法根据相邻行过滤掉值?如果为了简单起见我读了五行,结果是:77,77,76102,77。。。我可以说任何序列行之间的差异大于x的东西,忽略它,因为它是坏数据


[/longWinded]

没有你的模式很难回答,所以我做了一个测试来重现你的问题

您需要在一个时间范围内平均温度,然后将此值与当前行进行比较。如果差异太大,则不选择此行。在我的小提琴中,这是通过以下方式完成的:

abs(temp - (SELECT AVG(temp) FROM temperature AS t 
            WHERE 
              t.timeRead BETWEEN 
                           DATE_ADD(temperature.timeRead, interval-3 HOUR) 
                         AND
                           DATE_ADD(temperature.timeRead, interval+3 HOUR))) < 8

此条件是计算过去3小时和未来3小时的平均温度。如果差值超过8度,则跳过这一行。

使用某种平均技术,如滑动窗口。如果你使窗口变大,它将抵抗大的波动。没有你的模式,就不可能给出准确的答案。。。但我会尝试移动平均子查询之类的方法。这个stackoverflow.com/questions/878473/…可能会帮助您从这个方向开始。没有你的模式,也不知道你尝试过什么,除了给你指出一个可能被证明有用的方向之外,没有人能做很多事情?!太棒了,这对我来说是新鲜事。谢谢