Ngày của bạn không chính xác. Khi bạn đặt hàng theo cột này, bạn đặt hàng theo ngày trước. Thứ tự thích hợp là năm-tháng-ngày. Sử dụng loại dữ liệu, ngày giờ hoặc dấu thời gian thích hợp. Để làm điều này, bạn có thể làm như sau:
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`;
Sau đó, truy vấn để nhận được kết quả mong muốn của bạn là:
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;
Tất cả những gì bạn phải làm là thêm một biến khác để giữ giá trị của hàng trước đó.
- xem nó hoạt động trực tiếp trong sqlfiddle
- đây là một sqlfiddle khác để giới thiệu điều gì sẽ xảy ra khi bạn có 3 hàng cho mỗi ID