sql >> Database >  >> RDS >> Mysql

Vergelijk rijen in dezelfde tabel in mysql

U kunt een "self-join" uitvoeren (de tabel aan zichzelf koppelen) om query's uit te voeren. Het lastige hier is om de volgorde te kennen waarin rijen in de tabel zijn ingevoegd en alleen rijen te vergelijken die sequentieel (tijdelijk) aangrenzend zijn. Ik neem aan dat je een soort TIMESTAMP-kolom hebt die je vertelt welke prijswijzigingen na de vorige kwamen. Zo niet, dan kan "ID" u daar misschien over informeren (de grotere ID-rij wordt ingevoegd na de kleinere ID).

Als u uw tafel 'TAB' noemt, 'TRADER' gebruikt om de join te geven en 'ID' gebruikt om de Order te leveren, zou de query een drieweg self-join vereisen, zoals als volgt:

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

De bovenstaande query voegt de tabel twee keer samen, zodat elk tabblad het volgende vertegenwoordigt:

  • tab a :De recentere rij ter vergelijking
  • tab b :De direct voorafgaande rij om mee te vergelijken
  • tab c :Een rij tussen a &b in de tijd (mag niet bestaan)

We voeren een LEFT OUTER JOIN uit naar 'tab c' omdat we eigenlijk niet willen dat die rij bestaat. In de waar-clausule filteren we onze resultaten alleen naar de resultaten waar een 'tab c'-rij niet bestaat.

Ten slotte voert de query een 'GROUP BY' uit op de handelaar en SUM()s de verhogingen en verlagingen door de prijs van de 'a'- en 'b'-rijen te vergelijken.

Dit was een leuke uitdaging. Ik hoop dat dit helpt!

john...




  1. dynamische sql-query in postgres

  2. Oracle Pl/SQL:Loop door XMLTYPE-knooppunten

  3. Alle items in één tabel selecteren en deelnemen aan een andere tafel, waarbij nulls worden toegestaan

  4. Hoe krijg ik enkele kolomwaarden met MySQLi?