sql >> Database teknologi >  >> RDS >> Mysql

Sammenlign rækker i samme tabel i mysql

Du kan udføre en "selv-join" (samle tabellen til sig selv) for at udføre forespørgsler. Den vanskelige del her er at kende rækkefølgen, hvori rækker blev indsat i tabellen, og kun at sammenligne rækker, der er sekventielt (tidsbestemt) tilstødende. Jeg går ud fra, at du har en slags TIDSTAMPE-kolonne, der fortæller dig, hvilke prisændringer der kom efter de foregående. Hvis ikke, så kan "ID" måske informere dig om det (den største ID-række indsættes efter det mindre ID).

Ved at kalde din tabel 'TAB', bruge 'TRADER' til at give joinforbindelsen og bruge 'ID' til at angive ordren, ville forespørgslen kræve en tre-vejs selv-join som følger:

SELECT a.trader
     , SUM(IF(a.price > b.price, 1, 0)) nbr_incr
     , SUM(IF(a.price < b.price, 1, 0)) nbr_decr
     , SUM(IF(a.price = b.price, 1, 0)) nbr_same
  FROM tab a
  JOIN tab b 
    ON a.trader = b.trader AND a.id > b.id
  LEFT OUTER JOIN tab c 
    ON a.trader = c.trader AND a.id > c.id AND b.id < c.id
 WHERE c.id IS NULL
 GROUP BY a.trader

Ovenstående forespørgsel forbinder tabellen med sig selv to gange, så hver fane repræsenterer følgende:

  • tab a :Den seneste række til sammenligning
  • fane b :Den umiddelbart foregående række, der skal sammenlignes med
  • tab c :En række mellem a og b tidsmæssigt (bør ikke eksistere)

Vi udfører en LEFT OUTER JOIN til 'tab c', fordi vi faktisk ikke ønsker, at den række skal eksistere. I where-klausulen filtrerer vi kun vores resultater til de resultater, hvor en 'tab c'-række ikke eksisterer.

Til sidst udfører forespørgslen en 'GROUP BY' på den erhvervsdrivende, og SUM() er stigningerne og decrementerne ved at sammenligne prisen fra 'a'- og 'b'-rækkerne.

Dette var en sjov udfordring. Håber dette hjælper!

john...




  1. MAX() – Find den maksimale værdi i en kolonne i MySQL

  2. PHP date()-format ved indsættelse i datetime i MySQL

  3. Hvordan tilføjes en ny kolonne til MYSQL-tabellen?

  4. Sådan installeres og sikres MariaDB på Debian 9