Do czegoś takiego potrzebujesz dwóch przejść, ponieważ będziesz porównywać każdy rząd z poprzednim.
Jednym z takich sposobów na zrobienie tego byłoby najpierw:
SET @lastprice = 0.0;
Wtedy Twoje „pierwsze podanie” będzie wyglądać tak:
SELECT `Date`, @lastprice AS `oldprice`, @lastprice := `price` AS `newprice`
FROM `tablename` ORDER BY `Date` ASC;
Kolejność jest tutaj ważna, ponieważ chcesz zbudować chronologiczną oś czasu.
Następnie wystarczy pobrać wiersze z tego wyniku, w których stara i nowa cena są różne. Coś takiego zrobi:
SELECT * FROM ("Above subquery here") `tmp` WHERE `oldprice` != `newprice`;
Twoje ostateczne zapytanie wyglądałoby mniej więcej tak:
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`;
Alternatywnie możesz preferować użycie tabeli tymczasowej do przechowywania wyników podzapytania. W takim przypadku wyglądałoby to mniej więcej tak:
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`;
Dokładna implementacja zależy od Ciebie, ale byłby to dobry sposób, aby to zrobić.