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

时间:2014-06-06 16:24:57

标签: php mysql sql

我有一个简单的PHP / HTML页面,它运行MySQL查询以提取温度数据并显示在图表上。每隔一段时间,我的传感器会读取一些不良数据(DHT11 Temp / RH传感器,由Arduino读取),其中会出现过高或过低的尖峰,所以我知道它不是好的数据点。我发现这很容易处理,如果它是"方式"超出范围,因为不是一个理智的温度,我只是使用BETWEEN语句来过滤掉任何不可能的记录。

我确实认识到最终应该在源头修复这些错误读数从不首先发布,但作为调试工具,我确实想在我的数据库中记录这些错误,所以我可以追踪到我的硬件错误的时间点。

然而,这对于实际上属于理智温度范围的偶然尖峰没有帮助。例如,如果它外面是65华氏度,并且传感器偶尔会抛出一个奇怪的读数并且我得到一个107 F读数,它会完全搞砸我的图形,缩放等等。我不能用BETWEEN过滤掉(我知道),因为107 F实际上是我所在地区实用的夏令时。

有没有办法根据相邻行过滤掉值?我可以做一些类似的事情,如果我为了简单起见我正在阅读五行,结果是:77,77,76,102,77 ......我可以说"任何超过(x)差异的东西顺序行之间,忽略它,因为它的数据不好" ?

[/冗长]

1 个答案:

答案 0 :(得分:1)

没有您的架构很难回答,所以我做了SQLFiddle来重现您的问题。

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

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度,那么我们会跳过这一行。