आपकी तिथियां गलत हैं। जब आप इस कॉलम के आधार पर ऑर्डर करते हैं, तो आप पहले दिन के हिसाब से ऑर्डर करते हैं। उचित आदेश वर्ष-महीने-दिन है। उचित डेटाटाइप, डेटाटाइम या टाइमस्टैम्प का प्रयोग करें। ऐसा करने के लिए आप निम्न कार्य कर सकते हैं:
alter table table1 add column d datetime;
update table1 set d = str_to_date(`Date`, '%d-%m-%Y %H:%i');
alter table table1 drop column `Date`;
आपका वांछित परिणाम प्राप्त करने के लिए प्रश्न यह है:
SELECT ID, d, Value,
IF(@ID=ID, Value - @prevV, 'N/A') AS diff,
@row_number:=CASE WHEN @ID=ID THEN @row_number+1 ELSE 1 END AS row_number,
@prevV := Value,
@ID:=ID AS ID
FROM table1
, (SELECT @row_number:=0, @ID:='', @prevV := NULL) AS t
ORDER BY id, d;
आपको केवल पिछली पंक्ति के मान को बनाए रखने के लिए एक और चर जोड़ना है।
- इसे एक sqlfiddle में लाइव काम करते हुए देखें
- यह रहा एक और sqlfiddle यह दिखाने के लिए कि क्या होता है जब आपके पास प्रति आईडी 3 पंक्तियाँ होती हैं