6

特定のオブジェクトのイベントがリストされているテーブルがあります。

「移動」と「負荷」の2つのイベントがあります。それらは開始および終了することができ、これらのイベントは発生時のタイムスタンプとともにリストされます。

今、私は次の3つの数値を計算したい:

  • 移動が行われた時間の合計 (フィドルの値: 700)
  • ロードが行われた時間の合計 (フィドルの値: 630)
  • 移動と負荷が発生した時間の合計 (フィドルの値: 611)

ここで問題の sqlfiddle を作成しました。

http://sqlfiddle.com/#!2/be512

4

3 に答える 3

2

これを試して

ロードの回答は 690 ではなく 630 になります

1 番目と 2 番目のケースの場合

SELect max(timestamp) - min(timestamp), LEFT(event, LOCATE(' ', event)) 
FROM table1 
group by id, LEFT(event, LOCATE(' ', event));

3番目のケースの場合

SELect max(timestamp) - min(timestamp), id
FROM table1 
group by id;

フィドル

于 2013-02-27T13:09:10.740 に答える
1

これは、開始から終了までの時間を取得するためのクエリです。

select sum(a.timestamp-b.timestamp) from Table1 a join Table1 b on a.rowid-b.rowid=1 and a.rowid%2=0 and a.event='movement end';

同様に、終了と開始の間:

select sum(a.timestamp-b.timestamp) from Table1 a join Table1 b on a.rowid-b.rowid=1 and a.rowid%2=1 and a.event='movement start';
于 2013-02-27T13:15:14.210 に答える
1

end最初の 2 つの列は、対応する/startイベント間の差異を計算します。(合計は交換可能であるため、対応するイベントを実際に一致させる必要はありません。)

movement start3 番目の列は、前loadのイベントがイベントであるload startイベントmovement endと、次のloadイベントがイベントであるイベントを検索しますload end

SELECT (SELECT SUM(timestamp)
        FROM Table1
        WHERE event = 'movement end') -
       (SELECT SUM(timestamp)
        FROM Table1
        WHERE event = 'movement start') AS all_movement,

       (SELECT SUM(timestamp)
        FROM Table1
        WHERE event = 'load end') -
       (SELECT SUM(timestamp)
        FROM Table1
        WHERE event = 'load start') AS all_load,

       (SELECT SUM(timestamp)
        FROM Table1 a
        WHERE event = 'movement end' AND
              (SELECT event
               FROM Table1 b
               WHERE timestamp = (SELECT min(timestamp)
                                  FROM Table1 c
                                  WHERE c.timestamp >= a.timestamp
                                    AND c.event LIKE 'load %')
              ) = 'load end') -
       (SELECT SUM(timestamp)
        FROM Table1 a
        WHERE event = 'movement start' AND
              (SELECT event
               FROM Table1 b
               WHERE timestamp = (SELECT max(timestamp)
                                  FROM Table1 c
                                  WHERE c.timestamp <= a.timestamp
                                    AND c.event LIKE 'load %')
              ) = 'load start') AS load_movement;
于 2013-02-27T13:11:26.867 に答える