Làm việc với các biến MySQL rất tuyệt, nó giống như các phép gán biến chương trình nội tuyến. Đầu tiên, mệnh đề FROM "khai báo" các biến @ cho bạn, mặc định là trống. Sau đó, truy vấn các bản ghi theo thứ tự dự kiến mà bạn muốn. Nó thực hiện một lần chuyển qua dữ liệu thay vì thông qua các truy vấn con lặp đi lặp lại có thể tốn nhiều thời gian.
Đối với mỗi hàng đã đọc, hãy so sánh @lastSN với SN của bản ghi hiện tại. Nếu khác nhau, luôn trả về 0. Nếu giống nhau, hãy tính chênh lệch đơn giản. Chỉ SAU KHI quá trình so sánh hoàn tất, hãy đặt @lastSN và @lastValue bằng giá trị của bản ghi hiện tại để so sánh bản ghi tiếp theo.
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