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

Confronta le righe nella stessa tabella in MySQL

È possibile eseguire un "auto-unione" (unire la tabella a se stessa) per eseguire query. La parte difficile qui è conoscere l'ordine in cui le righe sono state inserite nella tabella e confrontare solo le righe adiacenti in sequenza (temporale). Presumo che tu abbia una sorta di colonna TIMESTAMP che ti dirà quali variazioni di prezzo sono arrivate dopo quelle precedenti. In caso contrario, forse "ID" può informarti di ciò (la riga dell'ID maggiore viene inserita dopo l'ID minore).

Chiamando il tuo tavolo "TAB", utilizzando "TRADER" per fornire il join e utilizzando "ID" per fornire l'ordine, la query richiederebbe un self-join a tre vie come segue:

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

La query precedente unisce la tabella a se stessa due volte in modo che ogni scheda rappresenti quanto segue:

  • tab a :la riga più recente per il confronto
  • tab b :la riga immediatamente precedente con cui confrontare
  • scheda c :una riga tra a e b nel tempo (non dovrebbe esistere)

Eseguiamo un LEFT OUTER JOIN su 'tab c' perché in realtà non vogliamo che quella riga esista. Nella clausola where, filtriamo i nostri risultati solo sui risultati in cui non esiste una riga "tab c".

Infine, la query esegue un "GRUPPO PER" sul trader e SUM()s incrementa e decrementa confrontando il prezzo dalle righe "a" e "b".

Questa è stata una sfida divertente. Spero che questo aiuti!

giovanni...