Работата с MySQL променливи е страхотна, като присвояването на вградени програмни променливи. Първо, клаузата FROM "декларира" променливите @ вместо вас, като по подразбиране е празно. След това потърсете записите в очаквания ред, в който искате. Той прави еднократно преминаване през данните вместо чрез повтарящи се подзаявки, което може да отнеме много време.
За всеки прочетен ред сравнете @lastSN със SN на текущия запис. Ако е различно, винаги връщайте 0. Ако е същото, изчислете простата разлика. Едва СЛЕД това сравнение е направено, задайте @lastSN и @lastValue равни на тези на текущия запис за следващото сравнение на записи.
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