Đối với những thứ như thế này, bạn cần hai lần vượt qua, bởi vì bạn sẽ so sánh từng hàng với hàng trước nó.
Một trong những cách làm như vậy trước tiên là:
SET @lastprice = 0.0;
Sau đó, "thẻ đầu tiên" của bạn sẽ có dạng:
SELECT `Date`, @lastprice AS `oldprice`, @lastprice := `price` AS `newprice`
FROM `tablename` ORDER BY `Date` ASC;
Thứ tự rất quan trọng ở đây, vì bạn muốn xây dựng tiến trình theo thứ tự thời gian.
Sau đó, tất cả những gì bạn cần làm là truy xuất các hàng từ kết quả này, nơi giá cũ và giá mới khác nhau. Một cái gì đó như thế này sẽ làm:
SELECT * FROM ("Above subquery here") `tmp` WHERE `oldprice` != `newprice`;
Truy vấn cuối cùng của bạn sẽ trông giống như sau:
SET @lastprice = 0.0;
SELECT * FROM (
SELECT `Date`, @lastprice AS `oldprice`, @lastprice := `price` AS `newprice`
FORM `tablename` ORDER BY `Date` ASC
) `tmp`
WHERE `oldprice` != `newprice`;
Ngoài ra, bạn có thể thích sử dụng một bảng tạm thời để lưu trữ các kết quả truy vấn con. Trong trường hợp đó, nó sẽ trông giống như thế này:
SET @lastprice = 0.0;
CREATE TEMPORARY TABLE `tmp`
SELECT `Date`, @lastprice AS `oldprice`, @lastprice := `price` AS `newprice`
FROM `tablename` ORDER BY `Date` ASC;
SELECT * FROM `tmp` WHERE `oldprice` != `newprice`;
DROP TEMPORARY TABLE `tmp`;
Việc triển khai chính xác là tùy thuộc vào bạn, nhưng đây sẽ là một cách tốt để thực hiện.