Lavorare con le variabili MySQL è fantastico, è come le assegnazioni di variabili di programma inline. Innanzitutto, la clausola FROM "dichiara" le variabili @ per te, per impostazione predefinita vuota. Quindi interroga i record nell'ordine previsto in cui li desideri. Esegue un singolo passaggio attraverso i dati invece che tramite sottoquery ripetute che possono richiedere molto tempo.
Per ogni riga letta, confronta @lastSN con l'SN del record corrente. Se diverso, restituisce sempre 0. Se è lo stesso, calcola la differenza semplice. Solo DOPO aver eseguito il confronto, imposta @lastSN e @lastValue uguali a quelli del record corrente per il confronto dei record successivi.
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