Trabalhar com variáveis do MySQL é ótimo, é como atribuições de variáveis de programa inline. Primeiro, a cláusula FROM "declara" as variáveis @ para você, deixando o padrão em branco. Em seguida, consulte os registros na ordem esperada que você deseja. Ele faz uma única passagem pelos dados em vez de por meio de subconsultas repetidas que podem consumir muito tempo.
Para cada linha lida, compare o @lastSN com o SN do registro atual. Se for diferente, sempre retorne 0. Se for o mesmo, calcule a diferença simples. Somente DEPOIS que a comparação for feita, defina @lastSN e @lastValue iguais ao do registro atual para a próxima comparação 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