2014-06-16 31 views
3

我有兩列ReceivedOn(日期/時間)和速度(INT) 樣品數據看起來像下面SQL查詢來獲取的列值的次數和持續時間號到達序列中的特定值

 ReceivedOn  | Speed 
---------------------------------------------- 
2012-11-05 06:30:00   10 
2012-11-05 06:31:00   45 
2012-11-05 06:32:00   48 
2012-11-05 06:33:00   53 
2012-11-05 06:34:00   47 
2012-11-05 06:35:00   38 
2012-11-05 06:36:00   22 
2012-11-05 06:37:00   36 
2012-11-05 06:38:00   41 
2012-11-05 06:39:00   47 
2012-11-05 06:40:00   49 
2012-11-05 06:41:00   22 
2012-11-05 06:42:00   36 

我需要組的行當速度> 40,以使所產生的輸出將是

 StartTime  | EndTime    | Count 
-------------------------------------------------------- 
2012-11-05 06:31:00  2012-11-05 06:34:00   4 
2012-11-05 06:38:00  2012-11-05 06:40:00   3 

開始時間是ReceivedOn值當速度第一次超過40,並且EndTime值在連續記錄中的連續記錄超過40時爲ReceivedOn值,Count是超過40的連續記錄的總數。

我盡我所能,但無法得到它。是否有可能得到這與SQL查詢? 請推薦。提前致謝。

+0

我真的不明白這個問題,你能給出更多的細節到底你想達到什麼嗎?謝謝 – dansasu11

+1

如果我理解正確的話,他希望'StartTime'在速度第一次超過40時就是ReceivedOn的值,EndTime的值在連續記錄中超過40時是ReceivedOn值, Count'是連續記錄的總數超過40個。 – Siyual

+0

正如@Siyual所說。我編輯了我的問題。 – user2848976

回答

1

下面是這些問題的一般答案。 Detect consecutive items meeting particular criteria in a time series

你的具體案例似乎更容易,因爲你沒有時間差距(他希望說)。你試圖找到你的時間序列中的差距。在你的情況下,差距被定義爲> = 40的項目。所以,你正在尋找值小於40的事件序列中的差距。

下面是一個查詢,可以爲您的時間排序行號。

SELECT @RowA := @RowA + 1 AS ROWNUM, 
     ReceivedOn, Speed 
    FROM (
     SELECT ReceivedOn, Speed 
      FROM obs 
     WHERE NOT Speed >= 40 
    ) AS A 
    JOIN (SELECT @RowA := 0) AS B 

現在您使用一些嚴重的SQL猴子業務來自我加入這個序列。這是這樣的:

SELECT B.ReceivedON + INTERVAL 1 MINUTE As StartTime, 
     A.ReceivedOn - INTERVAL 1 MINUTE AS EndTime, 
     -1 + TIMESTAMPDIFF(MINUTE, B.ReceivedOn, A.ReceivedOn) AS Count 
    FROM (
     SELECT @RowA := @RowA + 1 AS ROWNUM, 
       ReceivedOn, Speed 
      FROM (
       SELECT ReceivedOn, Speed 
       FROM obs 
       WHERE NOT Speed >= 40 
       ) AS A 
      JOIN (SELECT @RowA := 0) AS B 
     ) AS A 
    JOIN (
      SELECT @RowB := @RowB + 1 AS ROWNUM, 
       ReceivedOn, Speed 
     FROM (
       SELECT ReceivedOn, Speed 
       FROM obs 
       WHERE NOT Speed >= 40 
      ) AS A 
     JOIN (SELECT @RowB := 0) AS B 
     ) AS B ON B.ROWNUM+1 = A.ROWNUM 
WHERE TIMESTAMPDIFF(MINUTE, B.ReceivedOn, A.ReceivedOn) > 1 

http://sqlfiddle.com/#!2/2cb57/24/0

這看起來真的毛茸茸的,但它只是一個加入該第一查詢到自己ON B.ROWNUM+1 = A.ROWNUM。這將查詢的結果集排成一行,從而可以比較連續的行。

這給出了你需要的結果。請注意,如果您的第一個觀察值> = 40,則此查詢將忽略第一個觀察序列。

+0

謝謝@Ollie Jones。但可悲的是,記錄之間的時間差距並不固定。可能是幾秒鐘,幾分鐘或幾小時。否則,這將是一個很好的解決方案。我必須在樣本數據中找到每個出現速度超過某個x極限的情況。該事件的開始時間和結束時間。 – user2848976

相關問題