Maison >base de données >tutoriel mysql >Comment récupérer efficacement les enregistrements avec les valeurs les plus élevées ou les plus basses par groupe en SQL ?

Comment récupérer efficacement les enregistrements avec les valeurs les plus élevées ou les plus basses par groupe en SQL ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-11 17:57:16825parcourir

How to Efficiently Retrieve Records with the Highest or Lowest Values per Group in SQL?

Obtenir les enregistrements avec les valeurs les plus élevées/les plus petites par groupe

Problème :

Récupérer les enregistrements avec les valeurs les plus élevées ou les plus petites pour un champ donné dans chaque group.

Ancienne solution proposée :

Utilisation des rangs (@rank := @rank 1) dans des requêtes complexes avec des sous-requêtes.

Solution alternative :

Une approche plus efficace consiste à utiliser une jointure externe gauche sans classement variables :

SELECT t1.*
FROM `Table` AS t1
LEFT OUTER JOIN `Table` AS t2
  ON t1.GroupId = t2.GroupId AND t1.OrderField < t2.OrderField
WHERE t2.GroupId IS NULL
ORDER BY t1.OrderField;

Cette requête obtient le résultat souhaité en tirant parti d'une stratégie d'indexation sur (GroupId, OrderField) pour optimiser l'accès à t2.

Considérations d'optimisation :

  • Indexation : Il est essentiel d'avoir un index composé sur (GroupId, OrderField) pour des performances optimales.
  • Plusieurs valeurs les plus élevées/les plus petites : Pour gérer les cas où plusieurs enregistrements ont la même valeur la plus élevée/la plus petite au sein d'un groupe, étendez la condition comme suit :
AND (t1.OrderField < t2.OrderField 
     OR (t1.OrderField = t2.OrderField AND t1.Id < t2.Id))

Avantages de la jointure externe gauche Approche :

  • Aucune utilisation de classement ou de sous-requêtes, éliminant ainsi les problèmes de performances potentiels.
  • Meilleure optimisation, permettant à l'optimiseur de requêtes d'utiliser efficacement les index.
  • Exécution plus rapide par rapport aux méthodes basées sur le classement.

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!

Déclaration:
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