簡體   English   中英

MySQL:忽略行之間的差異大於x的結果

[英]MySQL: ignore results where difference is more than x between rows

我有一個簡單的PHP / HTML頁面,該頁面運行MySQL查詢以提取溫度數據並顯示在圖形上。 偶爾會從我的傳感器(DHT11溫度/ RH傳感器,由Arduino讀取)中讀取一些不良數據,其中會有一個過高或過低的峰值,因此我知道這不是一個好的數據點。 我發現這很容易解決,如果它“超出”范圍,因為在沒有理智的溫度下,我只是使用BETWEEN語句過濾掉所有可能不正確的記錄。

我確實意識到最終應該將其固定在源頭上,因此這些不良讀數永遠不會放在第一位,但是作為調試工具,我確實希望將這些錯誤記錄在我的數據庫中,因此我可以追蹤時間點當我的硬件出現錯誤時。

但是,這對實際落在理智溫度范圍內的偶然峰值沒有幫助。 例如,如果室外溫度為65 F,傳感器偶爾會拋出一個奇怪的讀數,而我卻得到107 F的讀數,它會完全弄亂我的圖表,比例尺等。我無法使用BETWEEN(我知道)進行過濾,因為107 F實際上是我所在地區的實際夏季溫度。

有沒有一種方法可以根據相鄰行來過濾掉值? 如果為了簡單起見,我要讀取五行,它們的結果是:77,77,76,102,77 ...我可以說“任何大於連續行之間的(x)差異的東西,我可以做些類似的事情嗎? ,請忽略它,因為它是錯誤的數據”?

[/冗長]

沒有您的模式很難回答,所以我做了一個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度,則跳過此行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM