sql >> Databasteknik >  >> RDS >> Mysql

Jämför rader i samma tabell i mysql

Du kan utföra en "self-join" (sammanfoga tabellen till sig själv) för att utföra frågor. Den knepiga delen här är att veta i vilken ordning rader infogades i tabellen, och att endast jämföra rader som ligger sekventiellt (temporärt) intill varandra. Jag antar att du har någon sorts TIDSTÄMPEL-kolumn som talar om för dig vilka prisändringar som kom efter de föregående. Om inte, kanske "ID" kan informera dig om det (den större ID-raden infogas efter det lägre ID-numret).

Genom att anropa din tabell för 'TAB', använda 'TRADER' för att tillhandahålla anslutningen och använda 'ID' för att tillhandahålla beställningen, skulle frågan kräva en trevägs självanslutning som följer:

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

Ovanstående fråga sammanfogar tabellen med sig själv två gånger så att varje flik representerar följande:

  • tab a :Den senaste raden för jämförelse
  • tab b :Den omedelbart föregående raden att jämföra mot
  • tab c :En rad mellan a och b tidsmässigt (ska inte finnas)

Vi utför en LEFT OUTER JOIN till 'tab c' eftersom vi faktiskt inte vill att den raden ska existera. I where-satsen filtrerar vi bara våra resultat till de resultat där en "tab c"-rad inte finns.

Slutligen utför frågan en 'GROUP BY' på handlaren och SUM()s ökningarna och minskningarna genom att jämföra priset från raderna 'a' och 'b'.

Det här var en rolig utmaning. Hoppas detta hjälper!

john...




  1. Formatera ett tal som valuta i MariaDB

  2. PGEast, Hardware Benchmarking och PG Performance Farm

  3. Säkerhetskopiera vyer med Mysql Dump

  4. Hur man genererar grafer och diagram från mysql-databas i php