2011-01-26 11 views
1

私の家に太陽光発電のデータを格納するMYSQLテーブルがあります。この表のデータを構成する2つのインバータ装置がポーリングしています。私は私がで生成されたどのくらいのエネルギーを伝えることができるように、インバータあたりの連続記録の違いを見つけようとしています連続して格納されていないSQLレコードの違いを見つける

id <auto_increment> 
addr <int address of the inverter> 
etotal <total generation since the device has been online> 

:何かのように簡素化するために、(説明を)私のテーブル構造の適切な部分がありますレコード間の期間(または最終的に選択した期間)。

SELECT (t2.etotal - t1.etotal) AS eperiod 
           FROM solars AS t1, solars AS t2 
           WHERE t1.id+2 = t2.id AND t1.created_at >= CURDATE() 
           AND t1.addr = 245 AND t2.addr = 245 ORDER BY t1.id; 

しかし、これは常に必要に応じて機能していない、そしてそれはお粗末な選択のように思える:レコードが一貫して挿入された場合は、私のような何かを行うことができます。私が持っていた唯一の他の考えは、自動インクリメントのIDを持つ一時テーブルを選択し、そのテーブルから同様の選択を行うことです。可能であれば、単一のクエリソリューションに興味があります。

+0

+1太陽エネルギーを使用します。 – Quassnoi

答えて

3
SELECT @ptotal - etotal, @ptotal := etotal 
FROM solars 
WHERE created_at >= CURDATE() 
     AND addr = 245 
ORDER BY 
     created_at, id 

は、結果を処理するときに、第2の列を無視するか、ネストされたクエリにそれをラップ:

SELECT diff 
FROM (
     SELECT @ptotal - etotal AS diff, @ptotal := etotal 
     FROM solars 
     WHERE created_at >= CURDATE() 
       AND addr = 245 
     ORDER BY 
       created_at, id 
     ) q 

複合インデックスを(addr, created_at, id)に作成すると、これが高速に機能します。

ディーゼル発電機(テストされていない)もサポートする必要があります。

+0

+1ディーゼル発電機をサポートします。 :-) –

+0

これは本質的にリストされているように機能しますが、私の必要性のための最初の列はetotal - @ptotalでなければなりません。どうもありがとう。 – markf

0

あなたは言うことができません
WHERE t1.created_at = t2.created_at

または私はあなたが問題だ理解していない。(それはもう少し遅くなることがありますが)$

関連する問題