K něčemu takovému potřebujete dva průchody, protože budete porovnávat každý řádek s tím před ním.
Jedním ze způsobů, jak to udělat, by bylo nejprve:
SET @lastprice = 0.0;
Poté bude váš „první průchod“ vypadat takto:
SELECT `Date`, @lastprice AS `oldprice`, @lastprice := `price` AS `newprice`
FROM `tablename` ORDER BY `Date` ASC;
Pořadí je zde důležité, protože chcete vytvořit chronologickou časovou osu.
Pak už jen stačí načíst řádky z tohoto výsledku, kde se staré a nové ceny liší. Něco takového udělá:
SELECT * FROM ("Above subquery here") `tmp` WHERE `oldprice` != `newprice`;
Váš poslední dotaz by vypadal asi takto:
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`;
Případně můžete dát přednost použití dočasné tabulky k uložení výsledků poddotazu. V tom případě by to vypadalo nějak takto:
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`;
Přesná implementace je na vás, ale toto by byl dobrý způsob, jak to udělat.