php - MySQL:忽略行之间差异大于 x 的结果

标签 php mysql sql

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

我确实意识到,最终应该在源头上修复这个问题,这样这些错误的读数就不会首先发布,但是作为一个调试工具,我实际上想在我的数据库中记录这些错误,这样我就可以追踪到我的硬件出现错误的时间点。

但是,这对于解决实际上落在正常温度范围内的偶尔峰值没有帮助。例如,如果外面是 65 F,传感器偶尔会抛出一个奇怪的读数,而我得到 107 F 的读数,它完全搞乱了我的图表、缩放比例等。我无法用 BETWEEN (据我所知)过滤它,因为华氏 107 度实际上是我所在地区的实际夏季温度。

有没有办法根据相邻行过滤掉值?我可以做类似的事情吗,如果为了简单起见我正在读取五行,并且它们的结果是:77,77,76,102,77 ...我可以说“任何连续行之间的差异超过(x)的东西,忽略它,因为它是坏数据”?

[/长篇大论]

最佳答案

如果没有你的模式,很难回答,所以我做了 SQLFiddle重现您的问题。

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

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 度,则我们跳过此行。

关于php - MySQL:忽略行之间差异大于 x 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24086561/

相关文章:

php - SSL 问题,登录网站

php - 动态加载命名空间类

mysql - 如何在 MySQL 中搜索具有 JSON 值的字段?

php - PHP strtotime 的奇怪日期问题

python - 将 Snowflake MD5 与 Python MD5 匹配

mysql - 在 MYSQL QUERY 中转换 MS SQL Server 查询

php - 从多个记录中获取主键-laravel

mysql - 如何一口气汇总多列记录并同时分明选择?

sql - 什么是 "bitmap index"?

javascript - 如何从 localhost php 文件中的 '$.post' 获取数据?