特定のオブジェクトのイベントがリストされているテーブルがあります。
「移動」と「負荷」の2つのイベントがあります。それらは開始および終了することができ、これらのイベントは発生時のタイムスタンプとともにリストされます。
今、私は次の3つの数値を計算したい:
- 移動が行われた時間の合計 (フィドルの値: 700)
- ロードが行われた時間の合計 (フィドルの値: 630)
- 移動と負荷が発生した時間の合計 (フィドルの値: 611)
ここで問題の sqlfiddle を作成しました。
特定のオブジェクトのイベントがリストされているテーブルがあります。
「移動」と「負荷」の2つのイベントがあります。それらは開始および終了することができ、これらのイベントは発生時のタイムスタンプとともにリストされます。
今、私は次の3つの数値を計算したい:
ここで問題の sqlfiddle を作成しました。
これを試して
ロードの回答は 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;
これは、開始から終了までの時間を取得するためのクエリです。
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';
end
最初の 2 つの列は、対応する/start
イベント間の差異を計算します。(合計は交換可能であるため、対応するイベントを実際に一致させる必要はありません。)
movement start
3 番目の列は、前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;