2012-09-13 22 views
0

我存儲值從一些模擬寄存器(0和1)到數據庫中,我希望做以下的表中:解析模擬值

我有在數據庫中的下表,用於存儲所述傳感器值:

ID |   TIMESTAMP  | ALIAS | STATUS 
1 | 2012-09-12 12:31:01 | AR1 |  0 
2 | 2012-09-12 12:31:02 | AR1 |  0 
3 | 2012-09-12 12:31:03 | AR1 |  0 
4 | 2012-09-12 12:31:04 | AR1 |  0 
5 | 2012-09-12 12:31:05 | AR1 |  0 
6 | 2012-09-12 12:31:06 | AR1 |  0 
7 | 2012-09-12 12:31:07 | AR1 |  1 
8 | 2012-09-12 12:31:08 | AR1 |  1 
9 | 2012-09-12 12:31:09 | AR1 |  1 
10 | 2012-09-12 12:31:10 | AR1 |  0 
11 | 2012-09-12 12:31:11 | AR1 |  0 
12 | 2012-09-12 12:31:12 | AR1 |  0 
13 | 2012-09-12 12:31:13 | AR1 |  0 
14 | 2012-09-12 12:31:14 | AR1 |  0 
15 | 2012-09-12 12:31:15 | AR1 |  1 
16 | 2012-09-12 12:31:16 | AR1 |  0 
17 | 2012-09-12 12:31:17 | AR1 |  0 
18 | 2012-09-12 12:31:01 | AR1 |  0 
... 

使用SQL查詢,我希望能夠當寄存器,從而無需使用不必要的點來創建一個圖形已經改變狀態返回。請記住,該表包含100萬以上的值,通過這樣做,我將減少返回的數據的大小,並且圖表將更快。

我不確定MySQL是否提供了所描述的功能,但起初我認爲GROUP BY可能是一個很好的解決方案,但不幸的是它不是。

有什麼建議嗎?

所需的輸出:

ID |   TIMESTAMP  | ALIAS | STATUS 
1 | 2012-09-12 12:31:01 | AR1 |  0 
6 | 2012-09-12 12:31:06 | AR1 |  0 
7 | 2012-09-12 12:31:07 | AR1 |  1 
9 | 2012-09-12 12:31:09 | AR1 |  1 
10 | 2012-09-12 12:31:10 | AR1 |  0 
14 | 2012-09-12 12:31:14 | AR1 |  0 
15 | 2012-09-12 12:31:15 | AR1 |  1 
16 | 2012-09-12 12:31:16 | AR1 |  0 
... 

你可以看到,我刪除連續值之間的中間線,因爲我只需要一個值的首次和最後出現和新的價值。

有什麼建議嗎?

+2

那些看起來像數字值。 –

+0

是的,你是正確的 – glarkou

+0

但二進制並不意味着數字。盯着你的燈開關一會兒... –

回答

1

我會做變量。不幸的是,我不能寫出來的,你知道,但請看到我的一個類似的反應在這裏:

get consecutive records in mysql

我會嘗試明天回來看看就可以了。

今天的回答是:

你能忍受只是行,其中狀態的變化(而不是也包括之前的行)?這將讓你的時間,與所有數據樣本被記錄的假設......

如果是這樣,這工作:

set @last_status = null; 
select id, timestamp, alias, status, 
    case when @last_status is null or status != @last_status then 1 else 0 end as changed, 
@last_status := status 
from sensor_values 
having changed = 1; 

如果沒有,我會我早晨起牀後一些關於它的更多的黑客採訪:)