Comment récupérer les Derniers Prix d’une table SQL Server de manière efficace

Dans le domaine de la gestion des bases de données, un défi courant auquel de nombreux développeurs font face est d’extraire les derniers prix pour divers produits ou articles d’une table qui contient des tonnes de données historiques. Si vous utilisez SQL Server, en particulier la version 2005, obtenir les derniers prix d’une table avec de nombreuses mises à jour de prix peut être décourageant, surtout lorsque l’ensemble de données est volumineux. Dans cet article de blog, nous allons aborder ce problème de front en vous montrant comment élaborer des requêtes SQL efficaces pour obtenir les uniques derniers prix—spécifiquement pour un groupe d’articles—sans un gonflement inutile de votre ensemble de résultats.

Comprendre le Problème

Étant donné la structure suivante de notre table :

ID uniqueidentifier not null,
ThingID int NOT NULL,
PriceDateTime datetime NOT NULL,
Price decimal(18,4) NOT NULL

Vous pouvez avoir des centaines d’enregistrements pour chaque “chose” chaque jour, ce qui rend pénible le tri des données pour les dernières mises à jour de prix. Par exemple, si vous exécutez une requête comme celle-ci :

SELECT * 
FROM Thing
WHERE ThingID IN (1,2,3,4,5,6)
  AND PriceDate > cast( convert(varchar(20), getdate(), 106) as DateTime) 

Cette requête renverra tous les enregistrements de prix pour les ThingIDs spécifiés à partir de la date actuelle, mais vous pourriez terminer avec des centaines de lignes—beaucoup plus que ce dont vous avez réellement besoin. Le besoin est clair : récupérer juste un enregistrement (le prix le plus récent) pour chaque ThingID. Alors, comment cela peut-il être réalisé de manière optimale ?

Solution : Utiliser des Sous-requêtes

Pour obtenir les derniers prix d’aujourd’hui sans encombrer vos résultats, l’approche recommandée est d’utiliser une sous-requête. Voici comment vous pouvez faire cela efficacement :

Exemple de Requête SQL

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

Dans cette requête, nous utilisons GROUP BY en conjonction avec un MAX(ID) pour nous assurer que vous récupérez la dernière entrée pour chaque ThingID. L’hypothèse ici est qu’un ID plus élevé signifie un prix plus récent, ce qui est une convention courante dans de nombreux designs de base de données.

Améliorer la Performance avec une Colonne IsCurrent

Bien que la requête ci-dessus soit efficace, pour des ensembles de données plus volumineux, il est conseillé d’inclure une colonne appelée IsCurrent. Cette colonne indique si le prix est le dernier (1 si c’est le cas, 0 sinon). Voici comment vous pouvez construire une requête simplifiée en utilisant cette approche :

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

Cette requête simple filtrera rapidement les derniers prix sans le surcharge des sous-requêtes. Cependant, il est crucial de maintenir la cohérence des données car le risque de données obsolètes ou incorrectes augmente avec le flag IsCurrent.

Gestion des Identifiants Uniques

Dans les cas où l’ID est un uniqueidentifier (GUID), une complexité supplémentaire se présente. Voici comment vous pouvez ajuster votre requête pour accommoder cette structure :

SELECT T.* 
FROM Thing T
JOIN (SELECT ThingID, max(PriceDateTime) AS LatestPriceDate
      FROM Thing 
      WHERE ThingID IN (1,2,3,4)
      GROUP BY ThingID) X 
ON X.ThingID = T.ThingID 
  AND X.LatestPriceDate = T.PriceDateTime
WHERE ThingID IN (1,2,3,4)

Cette requête mise à jour récupère efficacement les derniers prix en joignant la table originale avec une sous-requête qui décrit la date du prix le plus récent pour chaque groupe de ThingID.

Conclusion

Récupérer les derniers prix dans SQL Server à partir d’une table avec des données historiques significatives nécessite une structuration minutieuse des requêtes pour éviter les pièges de performance. En utilisant des sous-requêtes et en envisageant la mise en œuvre d’une colonne IsCurrent, vous pouvez réaliser une approche plus rationalisée et efficace pour gérer vos données de prix.

Que vous ayez simplement besoin de récupérer les enregistrements pour quelques articles ou que vous traitiez un ensemble de données étendu, ce guide vous aidera à obtenir les derniers prix sans tracas. Bonnes requêtes !