2016-08-03 20 views
1

私は、次のフィールドイベントテーブルから関連レコードを抽出する自己結合?

Time     |  Status 
2016-01-21 16:11:00 |  Connected 
2016-01-21 16:51:00 |  Disconnected 
2016-01-21 17:01:00 |  Connected 
2016-01-21 17:10:00 |  Status X 
2016-01-21 17:20:00 |  Status Y 
2016-01-21 17:25:00 |  Disconnected 
2016-01-21 17:30:00 |  Connected 
2016-01-21 17:32:00 |  Disconnected 

私は、出力がオンにこの

Disconnected      Connected 
2016-01-21 16:51:00  |   2016-01-21 17:01:00 
2016-01-21 17:25:00  |   2016-01-21 17:30:00 
2016-01-21 17:32:00  | 

などのようになりたいを持つテーブルを持っています。つまり、切断されたサーバーのデータを表示する必要があります。

私が書いたこの

select B.Time, A.Time 
from (select Time 
     from table 
     where Status = 'Connected') as A, table B 
where B.Status = 'Disconnected' 
and B.Time < A.Time; 

私の出力のようなクエリは、私はそれよりも大きい接続されたすべてのイベントを取得しています切断された各イベントのために、ある

Disconnected      Connected 
2016-01-21 16:51:00    2016-01-21 17:01:00 
2016-01-21 16:51:00    2016-01-21 17:30:00  

です。しかし、最初の接続されたイベントだけを、各行の切断されたイベントよりも大きくしたい。私に何ができる?

答えて

1

あなたは切断時間によってグループあなたの出力をすることができますし、最も早く取得する分を使用します。

SELECT B.Time, 
     min(A.Time) 
FROM 
    (SELECT TIME 
    FROM TABLE 
    WHERE Status = 'Connected') AS A, 
    TABLE B 
WHERE B.Status = 'Disconnected' 
    AND B.Time < A.Time 
GROUP BY 1 
; 

またはサブクエリなしを:

SELECT tab1.`time`, 
     min(tab2.`time`) 
FROM tab1 AS tab1 
LEFT JOIN tab1 AS tab2 ON tab2.time > tab1.time 
WHERE tab1.Status = 'Disconnected' 
GROUP BY 1 
; 
3

これまでの良好なアプローチは、より複雑なONを作成することですすべての時間論理を含む節。 (http://sqlfiddle.com/#!9/81f61/5/0

select dis.Time as disconnected, con.Time as connected 
    from ev dis 
    join ev con ON con.Status = 'connected' 
       AND dis.Status = 'disconnected' 
       AND con.Time = (select MIN(Time) 
           from ev 
           where Status = 'connected' 
            and Time > dis.Time) 

これは、それぞれが最初MIN()接続時間後、各切断時間より考慮に行を接合制限します。

これらのイベントレコードが多数ある場合は、このクエリを最適化するためにインデックスを(Status, Time)に配置することを検討してください。

0

私は前にこのクエリを使用しているし、うまく

SELECT B.Time, A.Time 
FROM table 
WHERE NOT EXISTS (
    SELECT time 
    WHERE b.Time = a.Time 
    AND b.Disconnected > a.Connected 
) 
動作するようです