sql >> Databáze >  >> RDS >> Mysql

Porovnejte řádky ve stejné tabulce v mysql

Chcete-li provádět dotazy, můžete provést "vlastní spojení" (připojení tabulky k sobě). Ošemetnou částí je zde znát pořadí, ve kterém byly řádky vkládány do tabulky, a porovnávat pouze řádky, které spolu (dočasně) sousedí. Předpokládám, že máte nějaký sloupec TIMESTAMP, který vám řekne, jaké změny cen nastaly po těch předchozích. Pokud ne, možná vás o tom může informovat "ID" (větší řádek ID se vloží za menší ID).

Zavoláním vaší tabulky 'TAB', použitím 'TRADER' k poskytnutí spojení a použitím 'ID' k poskytnutí objednávky by dotaz vyžadoval třícestné vlastní spojení, jako je následující:

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

Výše uvedený dotaz spojuje tabulku dvakrát, takže každá karta představuje následující:

  • karta a :novější řádek pro srovnání
  • karta b :Bezprostředně předchozí řádek, se kterým se má porovnávat
  • tab c :Řádek mezi a a b v čase (nemělo by existovat)

Provedeme LEFT OUTER JOIN na 'tab c', protože ve skutečnosti nechceme, aby tento řádek existoval. V klauzuli where filtrujeme naše výsledky pouze na výsledky, kde řádek 'tab c' neexistuje.

Nakonec dotaz provede u obchodníka 'GROUP BY' a SUM()s přírůstky a úbytky porovnáním ceny z řádků 'a' a 'b'.

Tohle byla zábavná výzva. Doufám, že to pomůže!

john...




  1. Jak vytvořit formulář z tabulky v Accessu 2016

  2. SQL:analyzujte jméno, prostřední a příjmení z pole celého jména

  3. Instalace SQL Server 2017

  4. Jak najít duplicitní záznamy v PostgreSQL