Das Arbeiten mit MySQL-Variablen ist großartig, es ist wie die Zuweisung von Inline-Programmvariablen. Erstens "deklariert" die FROM-Klausel die @-Variablen für Sie, standardmäßig leer. Fragen Sie dann die Datensätze in der erwarteten gewünschten Reihenfolge ab. Es führt einen einzigen Durchgang durch die Daten durch, anstatt über wiederholte Unterabfragen, die zeitintensiv sein können.
Vergleichen Sie für jede gelesene Zeile @lastSN mit der SN des aktuellen Datensatzes. Wenn unterschiedlich, immer 0 zurückgeben. Wenn es gleich ist, berechnen Sie die einfache Differenz. Setzen Sie erst NACH diesem Vergleich @lastSN und @lastValue für den nächsten Datensatzvergleich auf den Wert des aktuellen Datensatzes.
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