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

SQL テーブルとデータ抽出

    これにより、必要な結果が得られます。

    ;with cast_cte
    as
    (
      select [TRADE_ID], cast([TIMESTAMP] as datetime) timestamp, [SECURITY], [QUANTITY], cast([PRICE] as float) as price
      from tbProduct
    )
    select t1.trade_id, t2.trade_id, datediff(ms, t1.timestamp, t2.timestamp) as milliseconds_diff,
    ((t1.price - t2.price) / t1.price) * 100 as price_diff
    from cast_cte t1
    inner join cast_cte t2
    on datediff(ms, t1.timestamp, t2.timestamp) between 0 and 10000
    and t1.trade_id <> t2.trade_id
    where ((t1.price - t2.price) / t1.price) * 100 > 10
    or ((t1.price - t2.price) / t1.price) * 100 < -10
    

    ただし、スキーマと一般的なクエリ パラメータには多くの問題があります:

    1) 列はすべて varchar です。これは非常に非効率的です。目的の結果を得るには、すべてを適切なデータ型にキャストする必要があるからです。 datetime、int、float などを使用します (@Jeroen-Mostert の提案に従って、CTE を使用してクエリをクリーンアップしました)

    2) テーブルが大きくなると、使用される述語 (10 秒のタイムスタンプ) が適切にインデックス化されないため、このクエリのパフォーマンスが非常に低下し始めます。



    1. MySQLでユーザーごとに最大3つのアイテムを選択するにはどうすればよいですか?

    2. MySQLクエリのWHERE列はjson配列にあります

    3. mysqli_connect():(HY000 / 2002):ソケットを介してローカルMySQLサーバーに接続できません

    4. OracleのJavaソースでのxmlドキュメントの検証