Aby wykonać zapytania, możesz wykonać „samozłączanie” (dołączenie tabeli do siebie). Trudną częścią jest tutaj znajomość kolejności wstawiania wierszy do tabeli i porównywanie tylko wierszy, które sąsiadują sekwencyjnie (czasowo). Zakładam, że masz jakąś kolumnę TIMESTAMP, która powie Ci, jakie zmiany cen nastąpiły po poprzednich. Jeśli nie, być może "ID" może cię o tym poinformować (większy wiersz identyfikatora jest wstawiany po mniejszym identyfikatorze).
Wywołanie tabeli 'TAB', użycie 'TRADER' w celu zapewnienia sprzężenia i użycie 'ID' w celu dostarczenia zamówienia, zapytanie wymagałoby trójstronnego sprzężenia zwrotnego, takiego jak:
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
Powyższe zapytanie łączy tabelę ze sobą dwukrotnie, tak że każda karta reprezentuje następujące elementy:
- karta a:nowszy wiersz do porównania
- tab b :bezpośrednio poprzedzający wiersz do porównania
- Tab c :Wiersz między a i b w czasie (nie powinien istnieć)
Wykonujemy LEFT OUTER JOIN do „tab c”, ponieważ tak naprawdę nie chcemy, aby ten wiersz istniał. W klauzuli where filtrujemy nasze wyniki tylko do wyników, w których nie istnieje wiersz „tab c”.
Na koniec zapytanie wykonuje 'GROUP BY' na tradera, a SUM() przeprowadza przyrosty i spadki, porównując cenę z wierszy 'a' i 'b'.
To było zabawne wyzwanie. Mam nadzieję, że to pomoże!
Jan...