Maison > base de données > tutoriel mysql > Comment puis-je récupérer efficacement la dernière entrée de chaque groupe dans une table de base de données ?

Comment puis-je récupérer efficacement la dernière entrée de chaque groupe dans une table de base de données ?

Barbara Streisand
Libérer: 2025-01-25 19:53:09
original
786 Les gens l'ont consulté

How can I efficiently retrieve the latest entry for each group in a database table?

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal