Я думаю, что единственное решение с вашей структурой таблицы - это работать с подзапросом:
SELECT *
FROM Thing
WHERE ID IN (SELECT max(ID) FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID)
(с учетом самого высокого идентификатора также означает новейшую цену)
Однако я предлагаю вам добавить столбец «IsCurrent», который равен 0, если это не самая последняя цена, или 1, если это самая последняя. Это добавит возможный риск несогласованности данных, но значительно ускорит весь процесс, когда таблица станет больше (если она находится в индексе). Тогда все, что вам нужно сделать, это ...
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4)
AND IsCurrent = 1
UPDATE
Хорошо, Маркус обновил вопрос, чтобы показать, что ID - это uniqueid, а не 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". Не уверен, какая версия будет быстрее после того, как оптимизатор заработал.)