「自己結合」(テーブルをそれ自体に結合) を実行してクエリを実行できます。ここで注意が必要なのは、行がテーブルに挿入された順序を把握し、順番に (時間的に) 隣接している行のみを比較することです。以前の価格変更の後にどの価格変更が行われたかを示すある種の 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 : 比較対象の最新の行
- tab b : 比較する直前の行
- tab c : a & b の間の行 (存在しないはずです)
実際にはその行を存在させたくないので、'tab c' に対して LEFT OUTER JOIN を実行します。where 句では、'tab c' 行が存在しない結果のみに結果をフィルター処理します。
最後に、クエリはトレーダーに対して 'GROUP BY' を実行し、'a' 行と 'b' 行の価格を比較して、SUM() でインクリメントとデクリメントを計算します。
これは楽しい挑戦でした。お役に立てれば!
ジョン...