2017-05-12 6 views
1

私は同様の質問を検索しましたが、運がありません。 下のサンプル表。MySQLの平均時差が異なる列の値を持つ行別

ID | MO | Serial | PiID | Part_Number |  Timestamp 
1 | F610320 | 1 | QC1 | 4A130015 | 2017-05-10 09:55:28 
2 | F610320 | 2 | QC1 | 4A130015 | 2017-05-10 10:12:54 
3 | F610320 | 3 | QC1 | 4A130015 | 2017-05-10 10:19:47 
4 | F631323 | 1 | QC2 | 4A110007B | 2017-05-10 10:20:24 
5 | F631323 | 2 | QC2 | 4A110007B | 2017-05-10 10:21:50 
6 | F631323 | 3 | QC3 | 4A110007B | 2017-05-10 10:31:02 
7 | F631323 | 4 | QC3 | 4A110007B | 2017-05-10 10:31:02 

と私は平均時間でカラムをしたいGROUP BY A.MO、A.PiID

をデータログFROMコマンド のSELECT A. *、COUNT(A.MO)の後。 (個別のMOPiID)任意の助け

| MO | PiID | Part_Number |COUNT(MO)| average time 
| F610320 | QC1 | 4A130015 | 3 | (10:19:47 - 09:55:28)/3-1 
| F631323 | QC2 | 4A110007B | 2 |avg time between row by MO and PiID 
| F631323 | QC3 | 4A110007B | 2 |avg time between row by MO and PiID 

ありがとう! MySQLはSELECTGROUP BY節間の列のいくつかの奇妙な組み合わせを可能にしながら

+0

はただ一つのレコードを持っているために 'MO' /' PiID'の組み合わせのことが可能です​​3210機能を使用することができますか? – toonice

+0

私はドンノ、何とかそれは動作します。 :S ところで、他の答えはどこに行きましたか? まだ2つの違いを試しています。 – Doggy

+0

回答者によって削除されました。どうやら彼らは、回答が修正する価値がないか、それを修正すると、回答が他のもののように終わってしまうという意味になると結論づけました。 – toonice

答えて

1

は、標準SQLのための一般的なルールは「集計関数を使用しているとき、あなたのSELECT内のすべての列が集約されたかGROUP BYすぎに配置されたいずれかであることが必要」です。

は何あなたがやろうとしているのは、秒単位での平均時間を返します。この

select MO, PiID, Part_Number, 
     count(*) as CNT, 
     TIMESTAMPDIFF(SECOND, 
         min(Timestamp), 
         max(Timestamp) 
        )/(count(*) - 1) as Average_Time 
from datalog 
group by MO, PiID, Part_Number 
having count(*) > 1 

このようなクエリを必要としますが、同様に異なる時間単位を使用することができます。

平均時間差を計算するには少なくとも2つのタイムスタンプが必要であることを覚えておいてください。それでHAVING句を追加しました。それがなければ、MO/PiIDの組み合わせは1つの行だけでゼロ除算を引き起こします。

編集

MO/PiID組み合わせが1行を持っている場合は、最小値と最大値が同じになりますので、より良いそれについて考えた後、実際には、それゆえの違いがなる、HAVING句を必要としません0であり、そのクエリの結果は0/0となります。これは、MySQLがNULLに変換します。あなたの代わりにNULLを表示するための何か他のものを好む場合

、あなたは

select MO, PiID, Part_Number, 
     count(*) as CNT, 
     TIMESTAMPDIFF(SECOND, 
         min(Timestamp), 
         max(Timestamp) 
        )/(count(*) - 1) as Average_Time, 
     COALESCE(TIMESTAMPDIFF(SECOND, 
           min(Timestamp), 
           max(Timestamp) 
          )/(count(*) - 1), 
       'something_else') as Average_Time_Coalesced 
from datalog 
group by MO, PiID, Part_Number 
+0

平均を計算するために少なくとも2行は必要ありません。 –

+0

@TimBiegeleisen正しいですが、差の平均を計算するには2行が必要です。私は要件を違うと解釈したと思います。平均差を返す間に中点を返しています。 –

+0

@Tim Biegeleisen、彼らは、各*ポイント*ではなく、各*ピリオド*の平均時間を時間内に求めています。その期間の長さを計算するには、2つの時点が必要です。これは、1つの時点で、式がゼロ除算を返す理由です。 – toonice

関連する問題