sql >> データベース >  >> RDS >> Mysql

mysqlの同じテーブルの行を比較します

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

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

    ジョン...




    1. 16の異なるクエリ例を使用したMySQLのWHERE条件

    2. SQL Server(T-SQL)のデータベースメールキューのステータスを確認する

    3. OracleDatabaseからMariaDBへの移行-知っておくべきこと

    4. 高可用性のためにPostgreSQLをデプロイする方法