Maison > base de données > tutoriel mysql > Comment rechercher efficacement les valeurs minimales et maximales par groupe dans SQL sans utiliser de fonctions de classement ?

Comment rechercher efficacement les valeurs minimales et maximales par groupe dans SQL sans utiliser de fonctions de classement ?

Linda Hamilton
Libérer: 2024-12-23 22:32:17
original
739 Les gens l'ont consulté

How to Efficiently Find Minimum and Maximum Values per Group in SQL Without Using Ranking Functions?

Obtenir les valeurs les plus élevées et les plus petites par groupe

Vue d'ensemble

Ce didacticiel aborde la question de savoir comment récupérer les enregistrements avec les valeurs les plus élevées ou les plus petites pour un champ spécifié au sein de chaque groupe, sans compter sur le classement (@Rank). Alors que cette question initiale utilisait @Rank comme solution, les réponses suivantes démontrent une approche plus efficace utilisant les jointures.

Solution

Pour obtenir la ligne avec le OrderField le plus élevé pour chaque groupe, utilisez un élément extérieur gauche join et la requête suivante :

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

Si plusieurs enregistrements ont le même OrderField au sein d'un groupe et que vous en avez besoin, vous pouvez étendre la condition comme suit :

SELECT t1.*
FROM `Table` AS t1
LEFT OUTER JOIN `Table` AS t2
  ON t1.GroupId = t2.GroupId 
        AND (t1.OrderField < t2.OrderField 
         OR (t1.OrderField = t2.OrderField AND t1.Id < t2.Id))
WHERE t2.GroupId IS NULL
Copier après la connexion

Cette requête affinée garantit que t1 est renvoyé uniquement lorsqu'aucune autre ligne t2 n'existe dans le même groupe GroupId ayant soit une valeur OrderField supérieure, soit un OrderField égal avec une valeur Id inférieure. Ainsi, il récupère efficacement la ligne avec le plus grand OrderField au sein de chaque groupe.

Optimisation

L'utilisation de l'approche de jointure externe gauche peut améliorer considérablement les performances des requêtes par rapport à la méthode précédente impliquant @Rank et des sous-requêtes. La jointure externe gauche peut exploiter un index sur (GroupId, OrderField) pour un accès optimisé.

Attention concernant @Rank

L'approche initiale utilisant @Rank peut ne pas fonctionner comme prévu en raison du fait que Les incréments de @Rank se poursuivent après le traitement de la première table. Pour remettre @Rank à zéro entre les tables, vous devrez introduire une table dérivée supplémentaire, mais cela peut entraîner une mauvaise optimisation.

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