sql >> Databasteknik >  >> RDS >> Sqlserver

SQL-fråga för att få senaste pris

Jag tror att den enda lösningen med din tabellstruktur är att arbeta med en underfråga:

SELECT *
   FROM Thing
   WHERE ID IN (SELECT max(ID) FROM Thing 
                   WHERE ThingID IN (1,2,3,4)
                   GROUP BY ThingID)

(Med högsta ID betyder också det senaste priset)

Men jag föreslår att du lägger till en "IsCurrent"-kolumn som är 0 om det inte är det senaste priset eller 1 om det är det senaste. Detta kommer att lägga till den möjliga risken för inkonsekventa data, men det kommer att påskynda hela processen mycket när tabellen blir större (om den finns i ett index). Sedan är allt du behöver göra att...

SELECT *
   FROM Thing
   WHERE ThingID IN (1,2,3,4)
     AND IsCurrent = 1

UPPDATERA

Okej, Markus uppdaterade frågan för att visa att ID är ett unikt ID, inte ett int. Det gör att skriva frågan ännu mer komplicerad.

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)

Jag skulle verkligen föreslå att du använder antingen en "IsCurrent"-kolumn eller går med det andra förslaget som finns i svaren och använder "aktuellt pris"-tabell och en separat "prishistorik"-tabell (som i slutändan skulle vara den snabbaste, eftersom den håller priset bordet självt litet).

(Jag vet att ThingID längst ner är redundant. Prova bara om det är snabbare med eller utan det där "WHERE". Inte säker på vilken version som kommer att vara snabbare efter att optimeraren gjorde sitt arbete.)



  1. Ruby / Rails-array av strängar till PostgreSQL-inlägg

  2. Konfigurerar UTL_MAIL-paketförutsättningar

  3. SQL UPPDATERA alla värden i ett fält med bifogad sträng CONCAT fungerar inte

  4. Hur man släpper användare i postgres om den har beroende objekt