sql >> Base de Datos >  >> RDS >> Sqlserver

Consulta SQL para obtener el precio más reciente

Creo que la única solución con la estructura de su tabla es trabajar con una subconsulta:

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

(Dado el ID más alto también significa el precio más nuevo)

Sin embargo, le sugiero que agregue una columna "IsCurrent" que sea 0 si no es el último precio o 1 si es el último. Esto agregará el posible riesgo de datos inconsistentes, pero acelerará mucho todo el proceso cuando la tabla se haga más grande (si está en un índice). Entonces todo lo que necesitas hacer es...

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

ACTUALIZAR

De acuerdo, Markus actualizó la pregunta para mostrar que ID es un ID único, no un int. Eso hace que escribir la consulta sea aún más complejo.

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)

Realmente sugeriría usar una columna "IsCurrent" o ir con la otra sugerencia que se encuentra en las respuestas y usar la tabla de "precio actual" y una tabla separada de "historial de precios" (que en última instancia sería la más rápida, porque mantiene el precio la mesa en sí es pequeña).

(Sé que ThingID en la parte inferior es redundante. Solo intente si es más rápido con o sin ese "DÓNDE". No estoy seguro de qué versión será más rápida después de que el optimizador hizo su trabajo).