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

最新の価格を取得する SQL クエリ

    テーブル構造の唯一の解決策は、サブクエリを使用することだと思います:

    SELECT *
       FROM Thing
       WHERE ID IN (SELECT max(ID) FROM Thing 
                       WHERE ThingID IN (1,2,3,4)
                       GROUP BY ThingID)
    

    (最高の ID は最新の価格も意味します)

    ただし、最新の価格でない場合は 0、最新の場合は 1 である "IsCurrent" 列を追加することをお勧めします。これにより、データの一貫性が失われる可能性が高くなりますが、テーブルが大きくなると (インデックス内にある場合)、プロセス全体が大幅に高速化されます。あとは...

    SELECT *
       FROM Thing
       WHERE ThingID IN (1,2,3,4)
         AND IsCurrent = 1
    

    更新

    OK、Markus は質問を更新して、ID が int ではなく uniqueid であることを示しました。これにより、クエリの記述がさらに複雑になります。

    SELECT T.* 
       FROM Thing T
       JOIN (SELECT ThingID, max(PriceDateTime)
                WHERE ThingID IN (1,2,3,4)
                GROUP BY ThingID) X ON X.ThingID = T.ThingID 
                                    AND X.PriceDateTime = T.PriceDateTime
       WHERE ThingID IN (1,2,3,4)
    

    「IsCurrent」列を使用するか、回答にある他の提案を使用して、「現在の価格」テーブルと別の「価格履歴」テーブルを使用することをお勧めします(価格を保持するため、最終的にはこれが最速になります)テーブル自体は小さいです)。

    (一番下の ThingID が冗長であることはわかっています。「WHERE」を使用する場合と使用しない場合のほうが速いか試してみてください。オプティマイザが作業を行った後、どちらのバージョンが高速になるかはわかりません。)



    1. 漢字でMysql全文検索を実行する方法は?

    2. 実行時に異なるデータベースに接続するにはどうすればよいですか?

    3. PostgreSQL:OIDからByteaへ

    4. 多次元のphp配列をmysqlデータベースに挿入する