MySQL वेरिएबल्स के साथ काम करना बहुत अच्छा है, यह इनलाइन प्रोग्राम वेरिएबल असाइनमेंट की तरह है। सबसे पहले, FROM क्लॉज आपके लिए @ वेरिएबल्स को "घोषित" करता है, जो डिफॉल्ट रूप से रिक्त होता है। फिर अपेक्षित क्रम में रिकॉर्ड्स को क्वेरी करें जो आप उन्हें चाहते हैं। यह दोहराए गए सबक्वायरी के बजाय डेटा के माध्यम से एकल पास बनाता है जो समय गहन हो सकता है।
प्रत्येक पंक्ति पढ़ने के लिए, वर्तमान रिकॉर्ड के एसएन के साथ @lastSN की तुलना करें। यदि भिन्न है, तो हमेशा 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