Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Abfrage, um den neuesten Preis zu erhalten

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.)