簡體   English   中英

MySQL返回連續相同結果的第一個和最后一個記錄

[英]MySQL return first and last record for consecutive identical results

我正在使用MySQL並有一個名為“results”的表,它存儲監視器的結果,該監視器確定服務在特定時間是啟動還是關閉。

+-----------+------------+---------------------+--------+
| result_id | service_id | time_stamp          | result |
+-----------+------------+---------------------+--------+
|     1     |        1   | 0000-00-00 00:01:00 | down   |
|     2     |        1   | 0000-00-00 00:02:00 | up     |
|     3     |        1   | 0000-00-00 00:03:00 | up     |
|     4     |        1   | 0000-00-00 00:04:00 | up     |
|     5     |        1   | 0000-00-00 00:05:00 | down   |
|     6     |        1   | 0000-00-00 00:06:00 | down   |
|     7     |        1   | 0000-00-00 00:07:00 | up     |
|     8     |        1   | 0000-00-00 00:08:00 | down   |
|     9     |        1   | 0000-00-00 00:09:00 | up     |
|     10    |        2   | 0000-00-00 00:03:00 | up     |
+-----------+------------+---------------------+--------+

我想得到一個結果表,查看給定服務的結果,並返回它首次記錄為關閉的時間和最后一次(連續),反之亦然。 這將幫助我記錄服務停機的持續時間。

我要找的結果看起來像這樣。

對於service_id 1 ...

+-----------------------+---------------------+--------+
| start_time            | end_time            | result |
+-----------------------+---------------------+--------+
| 0000-00-00 00:01:00   | 0000-00-00 00:01:00 | down   |
| 0000-00-00 00:02:00   | 0000-00-00 00:04:00 | up     |
| 0000-00-00 00:05:00   | 0000-00-00 00:06:00 | down   |
| 0000-00-00 00:07:00   | 0000-00-00 00:07:00 | up     |
| 0000-00-00 00:08:00   | 0000-00-00 00:08:00 | down   |
| 0000-00-00 00:09:00   | 0000-00-00 00:09:00 | up     |
+-----------------------+---------------------+--------+

我可以很容易地用Java或PHP獲取這些信息,但我更喜歡使用SQL查詢。 我的SQL技能並不是特別先進。 我該如何處理?

最簡單的方法是使用變量,我認為最簡單的方法是添加兩個變量,一個是“up”的數量,另一個是“down”的數量,直到任何給定的行。 給定的ups序列對於先前“向下”的數量具有恆定值,反之亦然。 該邏輯可用於聚合。

生成的查詢是:

select result, min(time_stamp) as start_time, max(time_stamp) as end_time
from (select r.*,
             (@ups := @ups + (result = 'up')) as ups,
             (@downs := @downs + (result = 'down')) as downs
      from results r cross join
           (select @ups := 0, @downs := 0) vars
      where service_id = 1
      order by time_stamp
     ) r
group by result, (case when result = 'up' then downs else ups end);

暫無
暫無

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

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