sql >> Database >  >> RDS >> Mysql

MYSQL-query - krijg rijen waar de prijs is gewijzigd

Voor zoiets als dit heb je twee passen nodig, omdat je elke rij gaat vergelijken met de vorige.

Een manier om dit te doen zou zijn om eerst:

SET @lastprice = 0.0;

Uw "first pass" ziet er dan als volgt uit:

SELECT `Date`, @lastprice AS `oldprice`, @lastprice := `price` AS `newprice`
FROM `tablename` ORDER BY `Date` ASC;

De volgorde is hier belangrijk, omdat je een chronologische tijdlijn wilt bouwen.

Vervolgens hoeft u alleen de rijen uit dit resultaat op te halen waar de oude en nieuwe prijzen verschillen. Iets als dit is voldoende:

SELECT * FROM ("Above subquery here") `tmp` WHERE `oldprice` != `newprice`;

Uw uiteindelijke vraag zou er ongeveer zo uitzien:

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`;

Als alternatief kunt u er de voorkeur aan geven een tijdelijke tabel te gebruiken om de subqueryresultaten op te slaan. In dat geval zou het er ongeveer zo uitzien:

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`;

De exacte implementatie is aan jou, maar dit zou een goede manier zijn om het te doen.




  1. Zoekmatrix voor alle rechthoeken van bepaalde afmetingen (selecteer blokken stoelen)

  2. fouten weergeven als mysql_query niet succesvol is

  3. Oracle:als tabel bestaat

  4. Waarom in PostgreSQL enum type array null-waarden toegestaan?