Penso che l'unica soluzione con la struttura della tua tabella sia lavorare con una sottoquery:
SELECT *
FROM Thing
WHERE ID IN (SELECT max(ID) FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID)
(Dato l'ID più alto si intende anche il prezzo più recente)
Tuttavia ti suggerisco di aggiungere una colonna "IsCurrent" che è 0 se non è l'ultimo prezzo o 1 se è l'ultimo. Ciò aggiungerà il possibile rischio di dati incoerenti, ma accelererà molto l'intero processo quando la tabella diventa più grande (se si trova in un indice). Allora tutto quello che devi fare è...
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4)
AND IsCurrent = 1
AGGIORNAMENTO
Ok, Markus ha aggiornato la domanda per mostrare che l'ID è un ID univoco, non un int. Ciò rende la scrittura della query ancora più complessa.
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)
Suggerirei davvero di utilizzare una colonna "IsCurrent" o seguire l'altro suggerimento trovato nelle risposte e utilizzare la tabella "prezzo corrente" e una tabella separata "cronologia prezzi" (che alla fine sarebbe la più veloce, perché mantiene il prezzo tavolo stesso piccolo).
(So che ThingID in basso è ridondante. Prova solo se è più veloce con o senza "WHERE". Non sono sicuro di quale versione sarà più veloce dopo che l'ottimizzatore ha fatto il suo lavoro.)