Bekerja dengan variabel MySQL sangat bagus, seperti penugasan variabel program sebaris. Pertama, klausa FROM "mendeklarasikan" variabel @ untuk Anda, secara default kosong. Kemudian kueri rekaman dalam urutan yang diharapkan seperti yang Anda inginkan. Itu membuat satu kali melewati data alih-alih melalui subquery berulang yang bisa memakan waktu lama.
Untuk setiap baris yang dibaca, bandingkan @lastSN dengan SN dari record saat ini. Jika berbeda, selalu kembalikan 0. Jika sama, hitung selisih sederhananya. Hanya SETELAH perbandingan itu selesai, setel @lastSN dan @lastValue sama dengan catatan saat ini untuk perbandingan catatan berikutnya.
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