Мисля, че единственото решение с вашата структура на таблицата е да работите с подзаявка:
SELECT *
FROM Thing
WHERE ID IN (SELECT max(ID) FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID)
(Даденият най-висок ID означава и най-новата цена)
Въпреки това ви предлагам да добавите колона „IsCurrent“, която е 0, ако не е най-новата цена, или 1, ако е най-новата. Това ще добави възможния риск от непоследователни данни, но ще ускори много целия процес, когато таблицата стане по-голяма (ако е в индекс). Тогава всичко, което трябва да направите, е да...
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4)
AND IsCurrent = 1
АКТУАЛИЗАЦИЯ
Добре, Маркус актуализира въпроса, за да покаже, че ID е уникален идентификатор, а не int. Това прави писането на заявката още по-сложно.
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)
Наистина бих препоръчал да използвате или колона „IsCurrent“, или да отидете с другото предложение, намерено в отговорите, и да използвате таблица „текуща цена“ и отделна таблица „история на цените“ (което в крайна сметка ще бъде най-бързото, защото запазва цената самата маса е малка).
(Знам, че ThingID в долната част е излишен. Просто опитайте дали е по-бърз с или без това „WHERE“. Не съм сигурен коя версия ще бъде по-бърза, след като оптимизаторът свърши работата си.)