テーブル構造の唯一の解決策は、サブクエリを使用することだと思います:
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」を使用する場合と使用しない場合のほうが速いか試してみてください。オプティマイザが作業を行った後、どちらのバージョンが高速になるかはわかりません。)