Praca ze zmiennymi MySQL jest świetna, podobnie jak wbudowane przypisania zmiennych programu. Po pierwsze, klauzula FROM "deklaruje" zmienne @, domyślnie puste. Następnie przeszukuj rekordy w oczekiwanej kolejności. Wykonuje jednokrotne przejście przez dane zamiast powtarzających się podzapytań, co może być czasochłonne.
Dla każdego odczytanego wiersza porównaj @lastSN z SN bieżącego rekordu. Jeśli jest inny, zawsze zwracaj 0. Jeśli jest taki sam, oblicz prostą różnicę. Dopiero PO przeprowadzeniu porównania ustaw @lastSN i @lastValue równe wartości bieżącego rekordu dla następnego porównania rekordów.
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