Ich denke, die einzige Lösung mit Ihrer Tabellenstruktur besteht darin, mit einer Unterabfrage zu arbeiten:
SELECT *
FROM Thing
WHERE ID IN (SELECT max(ID) FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID)
(Die höchste ID bedeutet auch den neusten Preis)
Ich schlage jedoch vor, dass Sie eine Spalte "IsCurrent" hinzufügen, die 0 ist, wenn es nicht der neueste Preis ist, oder 1, wenn es der neueste ist. Dies erhöht das mögliche Risiko inkonsistenter Daten, beschleunigt jedoch den gesamten Prozess erheblich, wenn die Tabelle größer wird (wenn sie sich in einem Index befindet). Dann müssen Sie nur noch...
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4)
AND IsCurrent = 1
AKTUALISIEREN
Okay, Markus hat die Frage aktualisiert, um zu zeigen, dass ID eine Uniqueid ist, kein Int. Das macht das Schreiben der Abfrage noch komplexer.
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)
Ich würde wirklich vorschlagen, entweder eine Spalte "IsCurrent" zu verwenden oder sich an den anderen Vorschlag in den Antworten zu halten und die Tabelle "Aktueller Preis" und eine separate Tabelle "Preisverlauf" zu verwenden (was letztendlich die schnellste wäre, weil sie den Preis beibehält Tisch selber klein).
(Ich weiß, dass die ThingID unten redundant ist. Probieren Sie einfach aus, ob sie mit oder ohne "WHERE" schneller ist. Ich bin mir nicht sicher, welche Version schneller sein wird, nachdem der Optimierer seine Arbeit erledigt hat.)