「自己結合」(テーブルをそれ自体に結合する)を実行して、クエリを実行できます。ここで注意が必要なのは、行がテーブルに挿入された順序を把握し、順番に(一時的に)隣接している行のみを比較することです。以前の価格変更の後にどの価格変更が行われたかを示す、ある種のTIMESTAMP列があると想定しています。そうでない場合は、おそらく「ID」でそのことを通知できます(小さいIDの後に大きいID行が挿入されます)。
テーブルを「TAB」と呼び、「TRADER」を使用して結合を提供し、「ID」を使用して順序を提供する場合、クエリには次のような3方向の自己結合が必要になります。
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
上記のクエリは、テーブルをそれ自体に2回結合して、各タブが以下を表すようにします。
- tab a:比較のための最新の行
- タブb:比較する直前の行
- タブc:時間的にaとbの間の行(存在しないはずです)
その行を実際に存在させたくないので、「タブc」に対してLEFTOUTERJOINを実行します。 where句では、「tabc」行が存在しない結果にのみ結果をフィルタリングします。
最後に、クエリはトレーダーに対して「GROUP BY」を実行し、「a」行と「b」行の価格を比較して、増分と減分をSUM()します。
これは楽しい挑戦でした。これがお役に立てば幸いです!
ジョン...