Att arbeta med MySQL-variabler är fantastiskt, det är som inline-programvariabeltilldelningar. Först "deklarerar" FROM-satsen @-variablerna åt dig, som standard är tom. Fråga sedan posterna i den förväntade ordning du vill ha dem. Den gör en enda passage genom data istället för via upprepade underfrågor som kan vara tidskrävande.
För varje läst rad, jämför @lastSN med SN för den aktuella posten. Om olika, returnera alltid 0. Om det ÄR samma, beräkna den enkla skillnaden. Först EFTER att jämförelsen är gjord, ställ in @lastSN och @lastValue lika med det för den aktuella posten för nästa postjämförelse.
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