Travailler avec des variables MySQL est génial, c'est comme les affectations de variables de programme en ligne. Tout d'abord, la clause FROM "déclare" les variables @ pour vous, par défaut vide. Interrogez ensuite les enregistrements dans l'ordre prévu dans lequel vous les souhaitez. Il effectue un seul passage dans les données au lieu de passer par des sous-requêtes répétées qui peuvent prendre beaucoup de temps.
Pour chaque ligne lue, comparez le @lastSN avec le SN de l'enregistrement en cours. S'il est différent, renvoie toujours 0. Si c'est le même, calcule la différence simple. Seulement APRÈS la fin de la comparaison, définissez @lastSN et @lastValue égales à celles de l'enregistrement actuel pour la prochaine comparaison d'enregistrements.
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