Vos dates sont incorrectes. Lorsque vous commandez par cette colonne, vous commandez d'abord par jour. Le bon ordre est année-mois-jour. Utilisez le type de données, la date/heure ou l'horodatage appropriés. Pour ce faire, vous pouvez procéder comme suit :
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`;
La requête pour obtenir le résultat souhaité est alors :
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;
Tout ce que vous avez à faire est d'ajouter une autre variable pour contenir la valeur de la ligne précédente.
- le voir fonctionner en direct dans un sqlfiddle
- voici un autre sqlfiddle pour montrer ce qui se passe lorsque vous avez 3 lignes par ID