Acho que a única solução com sua estrutura de tabela é trabalhar com uma subconsulta:
SELECT *
FROM Thing
WHERE ID IN (SELECT max(ID) FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID)
(Dado o ID mais alto também significa o preço mais recente)
No entanto, sugiro que você adicione uma coluna "IsCurrent" que seja 0 se não for o preço mais recente ou 1 se for o mais recente. Isso adicionará o possível risco de dados inconsistentes, mas acelerará muito todo o processo quando a tabela ficar maior (se estiver em um índice). Então tudo que você precisa fazer é...
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4)
AND IsCurrent = 1
ATUALIZAÇÃO
Ok, Markus atualizou a pergunta para mostrar que ID é um uniqueid, não um int. Isso torna a escrita da consulta ainda mais complexa.
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)
Eu realmente sugeriria usar uma coluna "IsCurrent" ou ir com a outra sugestão encontrada nas respostas e usar a tabela "preço atual" e uma tabela separada "histórico de preços" (que seria a mais rápida, porque mantém o preço mesa em si pequena).
(Eu sei que o ThingID na parte inferior é redundante. Apenas tente se é mais rápido com ou sem "WHERE". Não tenho certeza de qual versão será mais rápida depois que o otimizador fizer seu trabalho.)