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

Query SQL per ottenere l'ultimo prezzo

Penso che l'unica soluzione con la struttura della tua tabella sia lavorare con una sottoquery:

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

(Dato l'ID più alto si intende anche il prezzo più recente)

Tuttavia ti suggerisco di aggiungere una colonna "IsCurrent" che è 0 se non è l'ultimo prezzo o 1 se è l'ultimo. Ciò aggiungerà il possibile rischio di dati incoerenti, ma accelererà molto l'intero processo quando la tabella diventa più grande (se si trova in un indice). Allora tutto quello che devi fare è...

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

AGGIORNAMENTO

Ok, Markus ha aggiornato la domanda per mostrare che l'ID è un ID univoco, non un int. Ciò rende la scrittura della query ancora più complessa.

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)

Suggerirei davvero di utilizzare una colonna "IsCurrent" o seguire l'altro suggerimento trovato nelle risposte e utilizzare la tabella "prezzo corrente" e una tabella separata "cronologia prezzi" (che alla fine sarebbe la più veloce, perché mantiene il prezzo tavolo stesso piccolo).

(So ​​che ThingID in basso è ridondante. Prova solo se è più veloce con o senza "WHERE". Non sono sicuro di quale versione sarà più veloce dopo che l'ottimizzatore ha fatto il suo lavoro.)