Myślę, że jedynym rozwiązaniem ze strukturą tabeli jest praca z podzapytaniem:
SELECT *
FROM Thing
WHERE ID IN (SELECT max(ID) FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID)
(Najwyższy identyfikator oznacza również najnowszą cenę)
Sugeruję jednak dodanie kolumny „IsCurrent”, która ma wartość 0, jeśli nie jest to najnowsza cena, lub 1, jeśli jest najnowsza. Doda to potencjalne ryzyko niespójności danych, ale znacznie przyspieszy cały proces, gdy tabela będzie większa (jeśli jest w indeksie). Wtedy wszystko, co musisz zrobić, to...
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4)
AND IsCurrent = 1
AKTUALIZUJ
Dobra, Markus zaktualizował pytanie, aby pokazać, że ID jest unikalnym identyfikatorem, a nie int. To sprawia, że pisanie zapytania jest jeszcze bardziej złożone.
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)
Naprawdę sugerowałbym użycie kolumny „IsCurrent” lub skorzystanie z innej sugestii znalezionej w odpowiedziach i użycie tabeli „bieżąca cena” i oddzielnej tabeli „historia cen” (która ostatecznie byłaby najszybsza, ponieważ utrzymuje cenę sam stół jest mały).
(Wiem, że ThingID na dole jest zbędny. Po prostu spróbuj, czy jest szybszy z czy bez tego „GDZIE”. Nie jestem pewien, która wersja będzie szybsza po wykonaniu pracy przez optymalizator.)