Du kan udføre en "selv-join" (samle tabellen til sig selv) for at udføre forespørgsler. Den vanskelige del her er at kende rækkefølgen, hvori rækker blev indsat i tabellen, og kun at sammenligne rækker, der er sekventielt (tidsbestemt) tilstødende. Jeg går ud fra, at du har en slags TIDSTAMPE-kolonne, der fortæller dig, hvilke prisændringer der kom efter de foregående. Hvis ikke, så kan "ID" måske informere dig om det (den største ID-række indsættes efter det mindre ID).
Ved at kalde din tabel 'TAB', bruge 'TRADER' til at give joinforbindelsen og bruge 'ID' til at angive ordren, ville forespørgslen kræve en tre-vejs selv-join som følger:
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
Ovenstående forespørgsel forbinder tabellen med sig selv to gange, så hver fane repræsenterer følgende:
- tab a :Den seneste række til sammenligning
- fane b :Den umiddelbart foregående række, der skal sammenlignes med
- tab c :En række mellem a og b tidsmæssigt (bør ikke eksistere)
Vi udfører en LEFT OUTER JOIN til 'tab c', fordi vi faktisk ikke ønsker, at den række skal eksistere. I where-klausulen filtrerer vi kun vores resultater til de resultater, hvor en 'tab c'-række ikke eksisterer.
Til sidst udfører forespørgslen en 'GROUP BY' på den erhvervsdrivende, og SUM() er stigningerne og decrementerne ved at sammenligne prisen fra 'a'- og 'b'-rækkerne.
Dette var en sjov udfordring. Håber dette hjælper!
john...