Myslím, že jediným řešením s vaší strukturou tabulky je pracovat s poddotazem:
SELECT *
FROM Thing
WHERE ID IN (SELECT max(ID) FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID)
(Uvedené nejvyšší ID znamená také nejnovější cenu)
Doporučuji však přidat sloupec „IsCurrent“, který je 0, pokud to není nejnovější cena, nebo 1, pokud je nejnovější. To sice přidá možné riziko nekonzistentnosti dat, ale hodně to celý proces urychlí, když se tabulka zvětší (pokud je v indexu). Pak vše, co musíte udělat, je...
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4)
AND IsCurrent = 1
AKTUALIZACE
Dobře, Markus aktualizoval otázku, aby ukázal, že ID je jedinečné ID, nikoli int. Díky tomu je psaní dotazu ještě složitější.
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)
Opravdu bych navrhoval použít buď sloupec "IsCurrent" nebo jít s jiným návrhem nalezeným v odpovědích a použít tabulku "aktuální cena" a samostatnou tabulku "historie cen" (což by nakonec bylo nejrychlejší, protože zachovává cenu samotný stůl je malý).
(Vím, že ThingID ve spodní části je nadbytečné. Jen zkuste, zda je rychlejší s tím „KDE“ nebo bez něj. Nejsem si jistý, která verze bude rychlejší, až optimalizátor odvede svou práci.)