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
Libérer: 2024-12-11 17:57:16
original
834 Les gens l'ont consulté

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

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

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!

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