Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Requête SQL pour obtenir le dernier prix

Je pense que la seule solution avec votre structure de table est de travailler avec une sous-requête :

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

(Étant donné l'ID le plus élevé, cela signifie également le prix le plus récent)

Cependant, je vous suggère d'ajouter une colonne "IsCurrent" qui vaut 0 si ce n'est pas le dernier prix ou 1 si c'est le dernier. Cela ajoutera le risque possible de données incohérentes, mais cela accélérera considérablement l'ensemble du processus lorsque la table grossira (si elle se trouve dans un index). Ensuite, tout ce que vous avez à faire est de...

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

MISE À JOUR

D'accord, Markus a mis à jour la question pour montrer que l'ID est un identifiant unique, pas un int. Cela rend l'écriture de la requête encore plus complexe.

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)

Je suggérerais vraiment d'utiliser soit une colonne "IsCurrent" ou d'aller avec l'autre suggestion trouvée dans les réponses et d'utiliser le tableau "prix actuel" et un tableau "historique des prix" séparé (qui serait finalement le plus rapide, car il maintient le prix table elle-même petite).

(Je sais que le ThingID en bas est redondant. Essayez simplement s'il est plus rapide avec ou sans ce "WHERE". Vous ne savez pas quelle version sera plus rapide une fois que l'optimiseur aura fait son travail.)