Maison > base de données > tutoriel mysql > Comment puis-je récupérer efficacement des lignes avec la valeur maximale par groupe dans une base de données relationnelle ?

Comment puis-je récupérer efficacement des lignes avec la valeur maximale par groupe dans une base de données relationnelle ?

Susan Sarandon
Libérer: 2025-01-21 08:03:10
original
964 Les gens l'ont consulté

How Can I Efficiently Retrieve Rows with the Maximum Value per Group in a Relational Database?

Rechercher efficacement des valeurs maximales au sein de groupes dans des bases de données relationnelles

Extraire des lignes contenant les valeurs maximales pour des colonnes spécifiques tout en préservant l'intégrité du groupe au sein de bases de données relationnelles peut être complexe. Cet article aborde le défi consistant à récupérer la ligne avec le numéro rond le plus élevé pour chaque ID unique, en donnant la priorité à l'efficacité des requêtes.

Une méthode utilise des sous-requêtes :

SELECT * FROM
(SELECT id, round,
CASE WHEN (MAX(round) OVER (PARTITION BY id)) = round THEN score ELSE NULL END score
 FROM
 SCORES
 where id in (1,2,3)
) scorevals
WHERE
scorevals.round is not null;
Copier après la connexion

Cependant, cette approche est inefficace en raison de l'étape de filtrage post-traitement.

Pour des performances améliorées, pensez à utiliser les fonctions de fenêtre :

SELECT DISTINCT
       id
      ,max(round) OVER (PARTITION BY id) AS round
      ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
FROM   SCORES
WHERE  id IN (1,2,3)
ORDER  BY id;
Copier après la connexion

Cette requête utilise des fonctions de fenêtre pour déterminer le tour maximum pour chaque ID, puis récupère le score correspondant. Le mot-clé DISTINCT garantit une seule ligne par ID.

Une alternative potentiellement plus rapide, utilisant deux fois la même fonction de fenêtre :

SELECT DISTINCT
       id
      ,first_value(round) OVER (PARTITION BY id ORDER BY round DESC) AS round
      ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
FROM   SCORES
WHERE  id IN (1,2,3)
ORDER  BY id;
Copier après la connexion

Les deux solutions optimisées évitent les filtrages inutiles, ce qui entraîne des temps d'exécution des requêtes plus rapides par rapport à l'approche des sous-requêtes.

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 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