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...