Maison >base de données >tutoriel mysql >Comment puis-je récupérer efficacement la valeur maximale par groupe dans une seule table SQL ?

Comment puis-je récupérer efficacement la valeur maximale par groupe dans une seule table SQL ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-21 07:56:14913parcourir

How Can I Efficiently Retrieve the Maximum Value per Group in a Single SQL Table?

Optimisation des requêtes SQL pour une récupération de valeur maximale par groupe

Une récupération efficace des données est primordiale lorsque vous travaillez avec de grandes tables SQL. Une tâche fréquente consiste à identifier la valeur maximale dans des groupes spécifiques de lignes. Cet article présente des requêtes SQL optimisées pour y parvenir efficacement, en évitant plusieurs analyses de table.

Considérons un tableau SCORES avec des colonnes ID, ROUND et SCORE. L'objectif est d'obtenir le maximum ROUND pour chaque ID et son SCORE correspondant. Les méthodes inefficaces impliquant un traitement itératif ne conviennent pas aux grands ensembles de données.

La requête suivante utilise les fonctions de fenêtre et DISTINCT pour des performances optimales :

<code class="language-sql">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;</code>

Cette approche utilise des fonctions de fenêtre pour calculer le maximum ROUND et le SCORE correspondant au sein de chaque ID groupe. La clause DISTINCT supprime ensuite les lignes en double, garantissant que seul le ROUND par ID le plus élevé est renvoyé. Cela réduit considérablement le temps de traitement par rapport aux analyses de plusieurs tables.

Une méthode alternative, tout aussi efficace, utilise FIRST_VALUE deux fois :

<code class="language-sql">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;</code>

Les deux requêtes donnent des résultats identiques :

ID ROUND SCORE
1 3 2
2 2 12
3 1 6

Ces requêtes optimisées offrent des améliorations de performances substantielles par rapport aux méthodes moins efficaces en récupérant la valeur maximale par groupe en une seule analyse de table. Ceci est crucial pour maintenir la réactivité lorsque vous traitez de grands ensembles de données.

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