sql >> Database >  >> RDS >> Sqlserver

SQL-query om de laatste prijs te krijgen

Ik denk dat de enige oplossing met je tabelstructuur is om met een subquery te werken:

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

(Gegeven de hoogste ID betekent ook de nieuwste prijs)

Ik raad u echter aan een kolom "IsCurrent" toe te voegen die 0 is als dit niet de laatste prijs is of 1 als dit de laatste is. Dit voegt het mogelijke risico van inconsistente gegevens toe, maar het zal het hele proces veel versnellen als de tabel groter wordt (als deze zich in een index bevindt). Dan hoef je alleen maar...

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

UPDATE

Oké, Markus heeft de vraag bijgewerkt om aan te tonen dat ID een uniqueid is, geen int. Dat maakt het schrijven van de query nog ingewikkelder.

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)

Ik zou echt willen voorstellen om ofwel een "IsCurrent" -kolom te gebruiken of met de andere suggestie in de antwoorden te gaan en de "huidige prijs" -tabel en een aparte "prijsgeschiedenis" -tabel te gebruiken (wat uiteindelijk de snelste zou zijn, omdat het de prijs behoudt tafel zelf klein).

(Ik weet dat de ThingID onderaan overbodig is. Probeer gewoon of het sneller is met of zonder dat "WAAR". Ik weet niet zeker welke versie sneller zal zijn nadat de optimizer zijn werk heeft gedaan.)



  1. Query met meerdere IN-clausules op meerdere rijen

  2. Psql een lijst van alle tabellen

  3. Bulksgewijs laden in PostgreSQL vanaf een externe client

  4. Fout bij aanmelden bij update