Obtenez efficacement les dernières entrées de chaque groupe
L'objectif est d'obtenir la dernière entrée pour chaque groupe unique à partir d'une table de base de données comme DocumentStatusLogs
. Ce tableau contient une série d'enregistrements de changement de statut de document, chaque document est identifié par DocumentID
. La tâche consiste à extraire le dernier statut mis à jour de chaque document et sa date associée.
Considérations sur la normalisation de la base de données
Tout d'abord, nous devons déterminer si la conception de la base de données a été correctement normalisée. Les informations d'état doivent-elles être stockées dans la table parent ou dans la table enfant ? Si vous avez uniquement besoin d'accéder au statut actuel de chaque document, il est préférable d'ajouter le champ de statut directement à la table parent et d'éviter d'utiliser une table distincte pour suivre les changements de statut. Toutefois, si vous devez conserver un historique des mises à jour d’état, il est avantageux de conserver les modifications d’état dans un tableau distinct.
Récupérer l'entrée principale
Retour à la question d'origine, il n'existe pas de fonction d'agrégation intégrée permettant de récupérer directement l'entrée supérieure de chaque groupe. Par conséquent, des requêtes ou sous-requêtes supplémentaires sont nécessaires pour obtenir les résultats souhaités.
Utiliser la sous-requête CTE
Une approche consiste à créer une expression de table commune (CTE) pour générer des résultats intermédiaires. Un CTE nommé cte
améliore le tableau d'origine en ajoutant un numéro de ligne à chaque entrée. Ce numéro de ligne est généré au sein de chaque groupe DocumentID
et est trié par ordre décroissant en fonction de DateCreated
.
<code class="language-sql">WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY DocumentID ORDER BY DateCreated DESC) AS rn FROM DocumentStatusLogs ) SELECT * FROM cte WHERE rn = 1</code>
Cette requête sélectionne la ligne entière de la table cte
avec le numéro de ligne (rn) égal à 1, fournissant ainsi l'entrée supérieure pour chaque groupe DocumentID
.
Méthodes alternatives
Une autre approche consiste à utiliser la fonction DENSE_RANK
au lieu de ROW_NUMBER
, surtout si vous attendez plusieurs entrées pour chaque DocumentID
à une date spécifique. DENSE_RANK
veillera à ce que toutes les participations pour une date spécifique reçoivent le même classement, vous permettant de récupérer deux participations pour cette date si vous le souhaitez.
Conclusion
En tirant parti de la technique ci-dessus, vous pouvez extraire efficacement la dernière entrée pour chaque groupe, soit en utilisant une sous-requête CTE, soit en utilisant la fonction DENSE_RANK
. La méthode que vous choisissez dépend de vos besoins en données et de vos considérations en matière de performances.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!