Jeg tror, at den eneste løsning med din tabelstruktur er at arbejde med en underforespørgsel:
SELECT *
FROM Thing
WHERE ID IN (SELECT max(ID) FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID)
(Med det højeste ID betyder også den nyeste pris)
Jeg foreslår dog, at du tilføjer en "IsCurrent"-kolonne, der er 0, hvis det ikke er den seneste pris, eller 1, hvis det er den seneste. Dette vil tilføje den mulige risiko for inkonsistente data, men det vil fremskynde hele processen meget, når tabellen bliver større (hvis den er i et indeks). Så skal du bare...
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4)
AND IsCurrent = 1
OPDATERING
Okay, Markus opdaterede spørgsmålet for at vise, at ID er et unikt id, ikke en int. Det gør skrivningen af forespørgslen endnu mere kompleks.
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)
Jeg vil virkelig foreslå at bruge enten en "IsCurrent"-kolonne eller gå med det andet forslag, der findes i svarene og bruge "aktuel pris"-tabel og en separat "prishistorik"-tabel (som i sidste ende ville være den hurtigste, fordi den holder prisen selve bordet er lille).
(Jeg ved, at ThingID'et i bunden er overflødigt. Prøv bare om det er hurtigere med eller uden det "WHERE". Ikke sikker på, hvilken version der vil være hurtigere, efter at optimeringsværktøjet gjorde sit arbejde.)