sql >> Database teknologi >  >> RDS >> Sqlserver

SQL-forespørgsel for at få seneste pris

Jeg tror, ​​at den eneste løsning med din tabelstruktur er at arbejde med en underforespørgsel:

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

(Med det højeste ID betyder også den nyeste pris)

Jeg foreslår dog, at du tilføjer en "IsCurrent"-kolonne, der er 0, hvis det ikke er den seneste pris, eller 1, hvis det er den seneste. Dette vil tilføje den mulige risiko for inkonsistente data, men det vil fremskynde hele processen meget, når tabellen bliver større (hvis den er i et indeks). Så skal du bare...

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

OPDATERING

Okay, Markus opdaterede spørgsmålet for at vise, at ID er et unikt id, ikke en int. Det gør skrivningen af ​​forespørgslen endnu mere kompleks.

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)

Jeg vil virkelig foreslå at bruge enten en "IsCurrent"-kolonne eller gå med det andet forslag, der findes i svarene og bruge "aktuel pris"-tabel og en separat "prishistorik"-tabel (som i sidste ende ville være den hurtigste, fordi den holder prisen selve bordet er lille).

(Jeg ved, at ThingID'et i bunden er overflødigt. Prøv bare om det er hurtigere med eller uden det "WHERE". Ikke sikker på, hvilken version der vil være hurtigere, efter at optimeringsværktøjet gjorde sit arbejde.)



  1. Hvordan udfylder man manglende datoer og værdier i partitionerede data?

  2. Tilfældig registrering fra en databasetabel (T-SQL)

  3. MySQL fejler på:mysql FEJL 1524 (HY000):Plugin 'auth_socket' er ikke indlæst

  4. SQL Server 2016:Opret en tabel fra et SQL-script