2013-07-25 45 views
1

連續值我有一個MySQL表是這樣的:檢查在MySQL查詢

ID - Time - Value 

而且我得到每對ID的,時間(由ID分組),其中價值超過一定的閾值。所以基本上,我得到的每個ID至少有一次的值大於閾值。查詢看起來是這樣的:

SELECT ID, Time FROM mydb.MYTABLE 
WHERE Value>%s AND Time>=%s AND Time<=%s 
GROUP BY ID 

編輯:時間檢查允許我所有的選擇是到表中的數據之間的時間範圍內進行操作;它與我所要求的沒有任何關係。

它完美的工作,但現在我想添加一些過濾:我希望它可以避免那些時間值大於閾值(讓我們稱之爲鬧鐘),如果鬧鐘還沒有發生,剛過。我的意思是:如果警報發生在單個孤立的瞬間,而不是兩個連續的時間,我會認爲這是一個虛驚,並避免它在查詢響應中返回。

當然,我可以通過調用每個Id來檢查這一點,但我希望在單個查詢中做到這一點,以使其更快。我想我可以使用條件,但是我沒有MySQL的專業知識。

任何幫助?

EDIT2:實施例爲閾值= 10

ID - Time - Value 
1 - 2004 - 9 
1 - 2005 - 11 
1 - 2006 - 8 
2 - 2107 - 12 
2 - 2109 - 13 
3 - 3402 - 11 
3 - 3403 - 12 

在這個例子中,只有ID 3應是一個有效的報警,由於用於這個ID 2個連續的時間值有其值>閾值。 ID 1有一個單獨的,孤立的警報,所以它應該是filteres。對於ID 2有兩個警報,但不是連續的,所以它也應該被過濾。

+1

你有什麼樣的數據,使問題更清楚? – Verma

+0

目前尚不清楚您的閾值/警報如何與您的查詢中已有的兩個時間參數相關,或者您打算如何處理閾值/警報。一個具體的例子可能有幫助 –

回答

1

事情是這樣的:

10 - is a threshold 
0 - minimum of the time period 
100000 - maximum of the time period 


select ID, min(Time) 

from 
(
SELECT ID, Time, 

     (select max(time) from t 
      where Time<t1.Time 
      and Id=t1.Id 
      and Value>10) LAG_G, 
     (select max(time) from t 
      where Time<t1.Time 
      and Id=t1.Id 
      and Value<=10) LAG_L, 
     (select min(time) from t 
      where Time>t1.Time 
      and Id=t1.Id 
      and Value>10) LEAD_G, 
     (select min(time) from t 
      where Time>t1.Time 
      and Id=t1.Id 
      and Value<=10) LEAD_L 

FROM t as t1 
WHERE Value>10 AND Time>=0 AND Time<=100000 
) t3 
where ifnull(LAG_G,0)>ifnull(LAG_L,0) 
     OR 
     ifnull(LEAD_G,100000)<ifnull(LEAD_L,100000) 

GROUP BY ID 

SQLFiddle demo

此查詢的工作搜索附近的記錄。

如果你需要時間來搜索記錄(+ 1,-1),正如您在註釋中嘗試此查詢:

select ID, min(Time) from t as t1 
where Value>10 
     AND Time>=%s2 AND Time<=%s1 
    and 
    ( 
     Exists(select 1 from t where Value>10 
           and Id=t1.Id 
           and Time=t1.Time-1) 
     OR 

     Exists(select 1 from t where Value>10 
           and Id=t1.Id 
           and Time=t1.Time+1) 
    ) 
group by ID 

SQLFiddle demo

+0

這不會檢查連續的「警報」,只會檢查警報是否發生超過曾經,我不是嗎? –

+0

@RomanRdgz我已經添加了一個新的查詢。嘗試一下。 – valex

+0

我真的不明白整個表達式,但無論如何ID 2不應該被列爲查詢輸出,因爲沒有連續2次警報。只有ID3應該出現(我甚至不需要時間作爲輸出)。這樣,如果時間代表分鐘(例如),我會過濾所以警報只發生在值超過閾值2分鐘時。這就是爲什麼我要求連續的時間點(實際上,這是一個問題的例子,我將使用每15分鐘採集一次樣本並以秒爲單位進行顯示,因此「連續條目」在900中有所不同)。 –

0

這樣的報警?

SELECT ID, Time , count(if(value>%treshold ,1,0)) alert_active 
FROM mydb.MYTABLE 
WHERE Value>%s3 AND Time>=%s2 AND Time<=%s1 
GROUP BY ID; 

我並不確切地明白:

在這個例子中,只有ID 3應是一個有效的報警,由於2個 此ID連續的時間值具有其值>閾值。 ID 1 有一個單獨的,孤立的警報,所以它應該filteres。對於ID 2, 是2個警報,但不是連續的,所以它也應該被過濾。

我猜你想過濾警報:

SELECT ID, Time 
FROM mydb.MYTABLE 
WHERE Value>%s3 AND Time>=%s2 AND Time<=%s1 
GROUP BY ID 
having value<%treshold; 
+0

我不明白Time_alarm和alert_active在這裏表示什麼。你能解釋一下嗎? –

+0

我給了你新的collumn'alert_active'你有警報(它們的數量)。我認爲鬧鐘應該被'時間'所觸發,所以我會編輯上面的查詢來做到這一點'價值'collumn – jaczes