2017-02-20 9 views
-1

私は以下のサンプルレコードを含むテーブルを持っています。ステータスと計算時間に基づいて1レコードを選択し、SQLをループする

Id | tutorid | status | timestamp 
1 | 21  | online | '2017-01-01 12:30:20' 
2 | 21  | away | '2017-01-01 13:27:20' 
3 | 31  | online | '2017-01-01 14:38:20' 
4 | 21  | offline| '2017-01-01 15:30:20' 
5 | 31  | away | '2017-01-01 17:20:20' 
6 | 21  | online | '2017-01-01 18:30:20' 
7 | 31  | online | '2017-01-01 18:30:20' 
8 | 31  | away | '2017-01-01 19:30:20' 
9 | 21  | online | '2017-01-01 19:47:20' 
10 | 31  | offline| '2017-01-01 19:59:20' 
11 | 21  | offline| '2017-01-01 20:01:20' 

tutoridごとに「オンライン」から「オフライン」にタイムスタンプをどのように選択するかを教えてください。オンラインはロギングおよびプレゼンス時間(ステータスはオフライン状態よりも前になります)およびオフラインはログアウトのタイミングです。離れているのは、家庭教師の内部状態です。

出力はこれが不完全な可能性があり

Tutorid | Online    | Offline 
21  |'2017-01-01 12:30:20' | '2017-01-01 15:30:20' 
31  |'2017-01-01 14:38:20' | '2017-01-01 19:59:20' 
21  |'2017-01-01 18:30:20' | '2017-01-01 20:01:20' 
+0

「離れ」ビットは無関係のように見えるので、私はすることから始めたいですそれらを無視する。 – Strawberry

答えて

0

ようにする必要がありますが、ここではスターターだ...

SELECT tutorid 
    , MIN(n.timestamp) online 
    , y_timestamp offline 
    FROM 
    (SELECT x.* 
      , MIN(y.timestamp) y_timestamp 
     FROM my_table x 
     JOIN my_table y 
      ON y.tutorid = x.tutorid 
      AND y.timestamp > x.timestamp 
      AND y.status = 'offline' 
     WHERE x.status = 'online' 
     GROUP 
      BY tutorid 
      , id 
    ) n 
GROUP 
    BY tutorid 
    , y_timestamp 
ORDER 
    BY online; 
関連する問題