インラインプログラム変数の割り当てのように、MySQL変数の操作は素晴らしいです。まず、FROM句は@変数を「宣言」し、デフォルトで空白になります。次に、必要な順序でレコードをクエリします。時間がかかる可能性のあるサブクエリを繰り返す代わりに、データを1回通過します。
読み取られた行ごとに、@lastSNを現在のレコードのSNと比較します。異なる場合は、常に0を返します。同じである場合は、単純な差を計算します。比較が行われた後でのみ、@ lastSNと@lastValueを、次のレコード比較のために現在のレコードと同じに設定します。
select
EL.SN,
EL.Date,
EL.Value, --remove duplicate alias
if( @lastSN = EL.SN, EL.Value - @lastValue, 0000.00 ) as Consumption,
@lastSN := EL.SN,
@lastValue := EL.Value
from
EnergyLog EL,
( select @lastSN := 0,
@lastValue := 0 ) SQLVars
order by
EL.SN,
EL.Date