2017-01-03 14 views
3

データベースに格納されているすべての操作の平均時間を計算する必要があります。テーブルIは、以下のように操作を格納する。データベースに格納されている平均操作時間

creation time  | operation_type | operation_id 
2017-01-03 11:14:25 | START   | 1 
2017-01-03 11:14:26 | START   | 2 
2017-01-03 11:14:28 | END   | 2 
2017-01-03 11:14:30 | END   | 1 

この場合、操作1は5秒かかり、操作2は2秒かかった。

MySQLでこれらの操作の平均を計算するにはどうすればよいですか?

EDIT:それoperation_idをが一意である必要はありませんようだ - 特定の操作を複数回実行することができる、ように見えるかもしれません表は、次のとおりです。私は、クエリに追加する必要がありますどのような

creation time  | operation_type | operation_id 
2017-01-03 11:14:25 | START   | 1 
2017-01-03 11:14:26 | START   | 2 
2017-01-03 11:14:28 | END   | 2 
2017-01-03 11:14:30 | END   | 1 
2017-01-03 11:15:00 | START   | 1 
2017-01-03 11:15:10 | END   | 1 

これらすべての操作の平均時間を適切に計算しますか?操作の終わりから

答えて

2

私はサブクエリが必要であることはよく分からない...

SELECT AVG(TIME_TO_SEC(y.creation_time)-TIME_TO_SEC(x.creation_time)) avg_diff 
    FROM my_table x 
    JOIN my_table y 
    ON y.operation_id = x.operation_id 
    AND y.operation_type = 'end' 
WHERE x.operation_type = 'start'; 
+0

ありがとう、それは最も簡単で最も簡単な解決策です! operation_idが一意ではないという事実を考慮して、このクエリを変更するにはどうすればよいですか?今日のオリジナルの質問を編集し、テーブルの外観を掲載しました。 – CorrieSparrow

+0

私の例は、(operation_type、operation_id)にPRIMARY KEYが形成されているという事実に頼っています。 – Strawberry

2

はSTART後、あなたがMINとMAX

select avg(diff) 
from 
(
     select operation_id, 
      TIME_TO_SEC(TIMEDIFF(max(creation_time), min(creation_time))) as diff 
     from your_table 
     group by operation_id 
) tmp 
+0

を使用することができます常にです受け入れられた答えは同じです - うまくいくようです。 –

+0

申し訳ありません - あなたは正しいです。 'TIME_TO_SEC'を追加して最終結果を秒単位で取得しました。 –

1
select avg(diff) 
from 
(
select a1.operation_id, timediff(a2.operation_time, a1.operation_time) as diff 
from oper a1 -- No table name provided, went with 'oper' because it made sense in my head 
inner join oper a2 
    on a1.operation_id = a2.operation_id 
where a1.operation_type = 'START' 
and a2.operation_type = 'END' 
) 
関連する問題