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