Можете да извършите "самоприсъединяване" (присъединяване на таблицата към себе си), за да изпълнявате заявки. Трудната част тук е да се знае реда, в който редовете са били вмъкнати в таблицата, и да се сравняват само редове, които са последователно (времево) съседни. Предполагам, че имате някаква колона TIMESTAMP, която ще ви каже кои промени в цената са дошли след предишните. Ако не, тогава може би „ID“ може да ви информира за това (по-големият ред се вмъква след по-малкия).
Извиквайки вашата таблица 'TAB', използвайки 'TRADER' за предоставяне на присъединяването и използвайки 'ID' за предоставяне на поръчката, заявката ще изисква тристранно самостоятелно присъединяване, както следва:
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
Горната заявка свързва таблицата със себе си два пъти, така че всеки раздел представлява следното:
- tab a :По-скорошният ред за сравнение
- tab b :Непосредствено предходният ред за сравнение
- раздел c :Ред между a и b по време (не трябва да съществува)
Ние изпълняваме LEFT OUTER JOIN към 'tab c', защото всъщност не искаме този ред да съществува. В клаузата where ние филтрираме нашите резултати само до резултатите, при които ред „tab c“ не съществува.
Накрая, заявката извършва 'GROUP BY' на търговеца и SUM()'s увеличава и намалява, като сравнява цената от редовете 'a' и 'b'.
Това беше забавно предизвикателство. Надявам се това да помогне!
Джон...