7

以下のようなmysqlテーブルがあります

id   trader price
111  abc    5 
222  xyz    5.20 
333  abc    5.70 
444  xyz    5 
555  abc    5.20 

行 1 の価格と行 2 の価格を比較する必要があり、指定されたサンプルによると、行 2 の価格は行 1 の価格よりも低くなります。これは、トレーダー xyz が価格を一度上げたことを意味します。行 2 の価格を行 3 の価格と比較する場合も同様です行 3 の価格が行 2 の価格よりも高い価格。これは、トレーダー abc も一度価格を上げたことを意味します。このようにして、テーブル全体を比較し、各トレーダーが価格を増減した回数を見つける必要があります...

私はこれを行う考えがありません。誰かがこれについて私を助けてくれますか

4

2 に答える 2

15

「自己結合」(テーブルをそれ自体に結合) を実行してクエリを実行できます。ここで注意が必要なのは、行がテーブルに挿入された順序を把握し、順番に (時間的に) 隣接している行のみを比較することです。以前の価格変更の後にどの価格変更が行われたかを示すある種の 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() でインクリメントとデクリメントを計算します。

これは楽しい挑戦でした。お役に立てれば!

ジョン...

于 2012-11-06T04:27:48.830 に答える
-1

価格変更の履歴を追跡する場合は、別のテーブルをセットアップする必要があります。また、列を指すときは、行を意味するように聞こえます。

于 2012-11-06T04:06:02.490 に答える