Trabajar con variables de MySQL es genial, es como asignaciones de variables de programa en línea. Primero, la cláusula FROM "declara" las variables @ por usted, por defecto en blanco. Luego consulte los registros en el orden esperado en que los desea. Realiza un solo paso a través de los datos en lugar de subconsultas repetidas que pueden consumir mucho tiempo.
Para cada lectura de fila, compare el @lastSN con el SN del registro actual. Si es diferente, siempre devuelva 0. Si ES el mismo, calcule la diferencia simple. Solo DESPUÉS de realizar la comparación, configure @lastSN y @lastValue iguales a los del registro actual para la siguiente comparación de registros.
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