Ik denk dat de enige oplossing met je tabelstructuur is om met een subquery te werken:
SELECT *
FROM Thing
WHERE ID IN (SELECT max(ID) FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID)
(Gegeven de hoogste ID betekent ook de nieuwste prijs)
Ik raad u echter aan een kolom "IsCurrent" toe te voegen die 0 is als dit niet de laatste prijs is of 1 als dit de laatste is. Dit voegt het mogelijke risico van inconsistente gegevens toe, maar het zal het hele proces veel versnellen als de tabel groter wordt (als deze zich in een index bevindt). Dan hoef je alleen maar...
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4)
AND IsCurrent = 1
UPDATE
Oké, Markus heeft de vraag bijgewerkt om aan te tonen dat ID een uniqueid is, geen int. Dat maakt het schrijven van de query nog ingewikkelder.
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)
Ik zou echt willen voorstellen om ofwel een "IsCurrent" -kolom te gebruiken of met de andere suggestie in de antwoorden te gaan en de "huidige prijs" -tabel en een aparte "prijsgeschiedenis" -tabel te gebruiken (wat uiteindelijk de snelste zou zijn, omdat het de prijs behoudt tafel zelf klein).
(Ik weet dat de ThingID onderaan overbodig is. Probeer gewoon of het sneller is met of zonder dat "WAAR". Ik weet niet zeker welke versie sneller zal zijn nadat de optimizer zijn werk heeft gedaan.)